1

char 配列のセクションを double に変換したいと考えています。たとえば、私は持っています:

char in_string[] = "4014.84954";

40最初の値を double の valueに変換したいとします40.0。これまでの私のコード:

#include <stdio.h>
#include <stdlib.h> 

int main(int arg) {
  char in_string[] = "4014.84954";
  int i = 0;
  for(i = 0; i <= sizeof(in_string); i++) {
    printf("%c\n", in_string[i]);
    printf("%f\n", atof(&in_string[i]));
  }
}

各ループatofで、char 配列を、指定した開始ポインターから配列の最後まで変換します。出力は次のとおりです。

4
4014.849540
0
14.849540
1
14.849540
4
4.849540
.
0.849540
8
84954.000000   etc...

char 配列の一部だけを double に変換するにはどうすればよいですか? 実際の input_string はもっと複雑なので、これはモジュラーでなければなりませんが、char が 0 から 9 の数字であることを保証します。

4

6 に答える 6

2

以下は、次の場合に機能するはずです。

char が 0 ~ 9 の数字であることを確認します。

double toDouble(const char* s, int start, int stop) {
    unsigned long long int m = 1;
    double ret = 0;
    for (int i = stop; i >= start; i--) {
        ret += (s[i] - '0') * m;
        m *= 10;
    }
    return ret;
}

たとえば、文字列23487の場合、関数は次の計算を行います。

ret = 0
ret += 7 * 1
ret += 8 * 10
ret += 4 * 100
ret += 3 * 1000
ret += 2 * 10000
ret = 23487
于 2013-03-23T06:26:08.610 に答える
1

sscanfを使用してください。形式「ld」を使用し、戻り値が 1 であることを確認します。

于 2013-03-23T06:32:43.390 に答える
1

必要な量の文字列を別のchar配列にコピーし、null で終了してから、double に変換できます。たとえば、2 桁が必要な場合は、必要な 2 桁charを長さ 3 の配列にコピーし、3 番目の文字がヌル ターミネータであることを確認します。

または、別の配列を作成したくない場合charは、char 配列の (n+1) 番目の文字をバックアップし、それをヌル ターミネータ (つまり 0x00) にatof置き換えて、 を呼び出し、ヌル ターミネータを値をバックアップします。これによりatof、null ターミネータを配置した場所の解析が停止します。

于 2013-03-23T06:22:45.303 に答える
0

(スタック上の)一時的な文字列で作業を行い、結果の double を返す関数を作成できます。

double atofn (char *src, int n) {
  char tmp[50]; // big enough to fit any double

  strncpy (tmp, src, n);
  tmp[n] = 0;
  return atof(tmp);
}
于 2013-03-23T06:30:08.940 に答える
0

sscanfよりもどれだけ簡単になるでしょうか?

#include <assert.h>
#include <stdio.h>

int main(void) {
    double foo;
    assert(sscanf("4014.84954", "%02lf", &foo) == 1);
    printf("Processed the first two bytes of input and got: %lf\n", foo);

    assert(sscanf("4014.84954" + 2, "%05lf", &foo) == 1);
    printf("Processed the next five bytes of input and got: %lf\n", foo);

    assert(sscanf("4014.84954" + 7, "%lf", &foo) == 1);
    printf("Processed the rest of the input and got: %lf\n", foo);
    return 0;
}
于 2013-03-23T06:58:59.183 に答える