1

我想将 char 数组的一部分转换为 double。例如我有:

char in_string[] = "4014.84954";

假设我想将第40一个转换为带有 value 的 double 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

您可以将所需数量的字符串复制到另一个char数组,空终止它,然后将其转换为双精度。例如,如果您想要 2 位数字,请将您想要的 2 位数字复制到char长度为 3 的数组中,确保第 3 个字符是空终止符。

或者如果你不想做另一个char数组,你可以备份char数组的第(n+1)个char,用空终止符(即0x00)替换它,调用atof,然后将空终止符替换为备份值。这将atof停止解析您放置空终止符的位置。

于 2013-03-23T06:22:45.303 回答
1

那怎么样,NULL在正确的位置插入,然后将其恢复为原始字母?这意味着您将操纵 char 数组,但最终会将其恢复为原始数组。

于 2013-03-23T06:28:26.637 回答
1

只需使用sscanf。使用格式“ld”并检查返回值是否为 1。

于 2013-03-23T06:32:43.390 回答
0

您可以创建一个函数,使工作在临时字符串中(在堆栈上)并返回结果双精度:

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 回答