我必须阅读这样一句话:
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?
答案 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
的小数点取决于区域设置。
在您的语言环境中,小数点似乎是,
,导致解析以.
结束。