我的代码:
while(scanf("%f", &number) && number > 0)
while(scanf("%f", &number) == 1 && number > 0)
== 1
是什么,这是必需的吗?
如Weather Vane中的comments所述,如果==1
返回将被评估为scanf()
的EOF
(文件末尾或-1),并且[[ C0]与上一次迭代保持不变,true
循环的条件将评估为number
。
这不适当,因为我们在扫描过程中出错,并且条件应该为while
或true
。
从false
引用,
成功完成后,这些功能应返回成功匹配和分配输入项;这个数字可以为零如果出现早期匹配失败。如果输入之前结束第一次匹配失败或转换时,应返回EOF。如果一个发生读取错误,已设置流的错误指示符,EOF应该返回,[GNU start]和errno应该设置为指出错误。 [GNU结束]
0
[这里,fscanf
可能返回:
fscanf
:流的结尾(while(scanf("%f", &number) && number > 0)
while(scanf("%f", &number) == 1 && number > 0)
)或读取错误,(如果要区分后一种情况,请参阅scanf
或-1
,在符合POSIX的系统上,EOF
将为设置,]ferror(stdin)
:匹配错误,和ferror(stdin)
:成功匹配的浮点数,存储在!feof(stdin)
中。因此,
第一个!feof(stdin)
测试它是否与errno
不为零匹配。在0
上,对于一个变量,它将按预期工作,但在1
上,它沿着短路进行以从未初始化的存储器读取;在下一次对number
的调用中,它可能会挂起,等待(最有可能)已关闭的scanf("%f", &number) [!= 0] && ...
的输入。
第二个"%f"
明确确认变量已被写入,然后继续执行下一条语句。这更加健壮,将一起处理匹配和读取错误,并且可以正常进行第二个谓词以检查它是否在域中。
但是,它没有记录循环停止的原因,并且随后的读取可能有问题。要获取该信息,请将变量分配给1
或-1
scanf
的返回值。