为什么这个atof()为非0.0字符串数字返回0.0?

时间:2013-10-03 13:52:35

标签: c floating-point atof

我必须阅读这样一句话:

0.000000 0.000000 -1.000000 -1.000000 0.230392 0.562016 -1.000000 -1.000000

使用strtok()while循环,我试图提取每个浮点数并将其存储在我的程序中。将令牌转换为浮点数时出现问题。这是我的代码:

double p;
char* token = strtok(line, " ");
while (token) {
    p = atof(token);
    printf("atof('%s') = %f\n", token, p);
    token = strtok(NULL, " ");
}

输出:

atof('0.000000') = 0,000000
atof('0.000000') = 0,000000
atof('-1.000000') = -1,000000
atof('-1.000000') = -1,000000
atof('0.230392') = 0,000000 <<<---- ???????????
atof('0.562016') = 0,000000 <<<---- ???????????
atof('-1.000000') = -1,000000
atof('-1.000000') = -1,000000

看到问题?为什么在传递0到1之间的字符串数时,atof返回0?

2 个答案:

答案 0 :(得分:6)

atof()(更具体地说,strtod())与语言环境有关。您的语言环境使用,表示小数,而输入字符串使用.指定小数点。由于atof()停止在第一个无效字符处进行解析,因此它返回0

简单的解决方法是将计算机的语言环境更改为其他语言环境,或更改输入字符串。

编辑: 您可以像这样更新输入字符串:

void update_string(char *str) {
    char *p = str;
    while(*p != '\0') {
        if(*p == '.')
            *p = ',';
        p++;
    }

这是一个相当临时(和丑陋)的解决方案。首选解决方案是更改您的区域设置。您可以永久地(查阅您的发行版文档)或暂时执行此操作。

暂时只需将LC_NUMERIC="C"放在命令前面即可。因此,如果编译的程序被称为a.out,则可以使用以下命令执行它:

LC_NUMERIC="C" ./a.out

或在setlocale()函数中使用main()

答案 1 :(得分:5)

atof的小数点取决于区域设置。 在您的语言环境中,小数点似乎是,,导致解析以.结束。