【问题标题】:What is the use of scanf() == 1?scanf() == 1 有什么用?
【发布时间】:2020-06-25 17:47:35
【问题描述】:

我的代码:

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

== 1 是什么意思,这有必要吗?

【问题讨论】:

  • 您的问题不清楚。你的意思是为什么有2个“==”?请编辑您的问题。
  • scanf 返回成功扫描的项目数。
  • == 1 是必要的,因为scanf 可以返回EOF,这将被隐式视为true,但没有读取number 的值。
  • 课程,始终根据您期望的转换次数明确测试返回(如果低于预期的总数,这可能小于格式字符串中的总数)
  • @hanie 当没有没有数据要扫描时。当有一些数据,但要扫描的类型错误时,scanf 返回0scanf 返回成功扫描的项目数,如果没有数据,则返回 EOF

标签: c loops while-loop scanf


【解决方案1】:

正如Weather Vanecomments 中所说,如果scanf() 返回EOF(文件结束或-1),则==1 很重要,这将被评估为true,并且由于number 与上一次迭代保持不变,while 循环的条件将被评估为 true

这是不合适的,因为我们在扫描过程中出现错误,条件应该是false0

【讨论】:

    【解决方案2】:

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

    • EOF:流结束或读取错误的负值,(如果要区分后一种情况,请参阅 ferror(stdin)!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] && ... 将在[0] 上返回false,在[EOF, 1] 上返回true。在1 上,对于一个变量,它会按预期工作,但在EOF 上,它会沿着短路继续从未初始化的内存中读取;在下一次调用scanf 时,它可能会挂起等待来自stdin 的输入(很可能)已关闭。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 2022-12-10
      • 2014-12-23
      • 2013-06-03
      • 2019-05-02
      相关资源
      最近更新 更多