sscanf returns 1 when searching for float in a string starting with the character n or i
在下面的代码中,我希望sscanf返回0,但它返回1并将0.000000分配给float变量x。 当字符串以字母i开头但没有其他字母时,会发生相同的行为。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| void main () {
int ss_return ;
float x ;
char str_to_sscanf [] ="noduh";
ss_return = sscanf( str_to_sscanf ,"%f", &x );
printf("
The word passed to sscanf is %s", str_to_sscanf );
printf("
When looking for a float, sscanf returned %d", ss_return );
printf("
and assigned %f to x (declared as float)", x );
printf("
WHY DID sscanf NOT RETURN ZERO????" );
} |
该程序的输出为:"两个看起来很奇怪的字符"
我想念什么?
-
在我的机器上工作。您需要记录所使用的编译器和C运行时库。
-
是的,什么操作系统?我怀疑这是一个错误。可能发生的情况是,错误的scanf实现将n视为潜在匹配("nan")的第一个字符,然后在无法完全匹配时,将非零长度部分匹配视为"成功",然后将其传递给strtod并获得0.0。
-
不要使用void main,请使用正确的int main。
-
特别是int main(void)-#include 不是可选的。
-
Windows Vista家庭高级版SP2; LCC-win32编译器。我在想类似的事情,即sscanf的实现将前导n解释为某物,而将前导i解释为某物并中止。在这种情况下,令人困惑的sscanf返回1。虐待尝试使用其他编译器...
-
抱歉,我一定没有从程序中复制#include 。我更改为int main(void)并具有相同的行为,但是感谢您的纠正。
-
strtod("noduh", NULL)返回什么?
-
通常,至少对于命令行程序而言,在每个打印格式字符串的末尾包括一个换行符比在开头(或同时包括)换行更好。在这种情况下,它对sscanf()的(错误)行为没有影响。
-
Keith-strtod(" noduh",NULL)返回0.0,这似乎是strtod转换失败时的返回值。为了好玩,我还尝试了strtod(" noduh999.999",NULL)并获得了0.0。为了确保strtod正常工作,我尝试了strtod(" 999.999",NULL)并返回了999.999。
-
使用Tiny C重新编译程序,并且sscanf可以正常工作。很奇怪。我已通过电子邮件发送给lcc-win32的开发人员,以查看他是否可以解释sscanf的行为。感谢大家的帮助!
我的猜测是您的库的状态机将" n"视为" NaN"的可能开始,而将" i"视为" inf"的可能开始,这使其陷入了float转换代码中。 然后由于无法完成解析并立即分配默认值,它立即退出工作。