2

我必须阅读这样的一行:

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

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

4

2 回答 2

7

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()功能中使用。

于 2013-10-03T14:03:14.877 回答
5

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

于 2013-10-03T14:01:20.803 回答