首页 > 解决方案 > scanf() == 1 有什么用?

问题描述

我的代码:

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

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

标签: cloopswhile-loopscanf

解决方案


在这种情况下,scanf, 将返回三个int值之一。

  • EOF:流结束或读取错误的负值,(如果要区分后一种情况,请参见ferror(stdin)or !feof(stdin),并且在符合 POSIX 的系统上,errno将被设置,)
  • 0:匹配错误,和
  • 1: 一个成功匹配的浮点数,存储在number.

所以,

while(scanf("%f", &number) && number > 0)
while(scanf("%f", &number) == 1 && number > 0)
  1. 第一个scanf("%f", &number) [!= 0] && ...将返回 false on [0], true on [EOF, 1]。On 1,在一个变量的情况下,它将按预期工作,但是 on EOF,它沿着短路继续从未初始化的内存中读取;在下一次调用 时scanf,它可能会挂起等待来自stdin(很可能)关闭的输入。

  2. 第二个scanf("%f", &number) == 1 && ...将返回 false on [EOF, 0], true on [1]。这明确确认在继续下一条语句之前已写入变量。这更健壮,可以同时处理匹配和读取错误,并且可以正常工作,继续进行第二个谓词以检查它是否在域中。

但是,它没有记录循环停止的原因,后续读取可能会出现问题。要获取该信息,可以将一个变量分配给 的返回值scanf


推荐阅读