scanf()== 1的用途是什么?

问题描述 投票:1回答:2

我的代码:

while(scanf("%f", &number) && number > 0) 
while(scanf("%f", &number) == 1 && number > 0)

== 1是什么,这是必需的吗?

c loops while-loop scanf
2个回答
2
投票

Weather Vane中的comments所述,如果==1返回将被评估为scanf()EOF(文件末尾或-1),并且[[ C0]与上一次迭代保持不变,true循环的条件将评估为number

这不适当,因为我们在扫描过程中出错,并且条件应该为whiletrue


1
投票

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)中。

因此,

  1. 第一个!feof(stdin)测试它是否与errno不为零匹配。在0上,对于一个变量,它将按预期工作,但在1上,它沿着短路进行以从未初始化的存储器读取;在下一次对number的调用中,它可能会挂起,等待(最有可能)已关闭的scanf("%f", &number) [!= 0] && ...的输入。

  2. 第二个"%f"明确确认变量已被写入,然后继续执行下一条语句。这更加健壮,将一起处理匹配和读取错误,并且可以正常进行第二个谓词以检查它是否在域中。

但是,它没有记录循环停止的原因,并且随后的读取可能有问题。要获取该信息,请将变量分配给1-1 scanf的返回值。

© www.soinside.com 2019 - 2024. All rights reserved.