【问题标题】:Return value EOF of scanf in CC中scanf的返回值EOF
【发布时间】:2015-04-14 21:22:07
【问题描述】:

C语言中的scanf,我对返回值有点困惑。

说明书上写着:

  1. 如果在第一次成功转换或发生匹配失败之前到达输入结尾,则返回 EOF。
  2. 如果发生读取错误,也会返回 EOF,在这种情况下会设置流的错误指示符。

首先,如果第一次成功转换之前或匹配之前达到输入结束,我不确定它们的含义发生故障。这怎么可能?

第二,不知道读取错误和匹配失败的区别?

【问题讨论】:

  • 对于屏幕输入,scanf会读取数据,直到你按下ctrl+z,也就是EOF但是屏幕输入。
  • @YazanWYusuf:这取决于您使用的平台...在 DOS/Windows 上,Ctrl+Z 将发送EOF;在 Unix 类型的系统上,通常是 Ctrl+D 信号 EOF

标签: c eof


【解决方案1】:

首先,如果在第一次成功转换之前或在匹配失败发生之前到达输入结尾,我不确定它们的含义。这怎么可能?

假设您正试图从文件中读取一个字符,而您位于文件的末尾。在任何成功的转换或匹配尝试发生之前,将到达输入的结尾。

第二,不知道读取错误和匹配失败的区别?

读取错误意味着您无法从FILE 读取数据。匹配失败意味着您能够读取数据,但它与预期不匹配(例如,读取 a 以获得 %d。)

【讨论】:

  • 用一些例子来补充大卫的答案。如果我有一个程序只打印出 scanf("%d",&x); 的返回值和存储值(即 x)...如果我执行 echo "" | ./a.out,我得到-1,0 [表示匹配问题之前的EOF);如果我回显“a” | ./a.out,我得到 0,0 [表明你有数据,但它不正确]...如果我回显“1”| ./a.out,我得到 1,1 [表示我得到一个结果,它是 1]
  • 所以当程序无法读取给定文件时,读取错误是什么?而匹配失败实际上是没有对应的对?
【解决方案2】:

函数scanf()返回成功读取和转换的字段数。但是,如果我输入(Windows)Ctrl-Z,则表示EOF。在Linux中,我认为可能是Ctrl-D?因此,如果您没有输入有意义的值,scanf() 会以某种方式表示失败。

通常,您会测试所需的输入数量,这也将涵盖EOF 的情况。

if (1 != scanf("%d", &i))
    printf ("No valid input\n");

【讨论】:

  • 那么第一部分是否意味着如果我输入停止(例如Ctrl-Z)而不是预期值,则返回EOF?
  • 你应该尝试一下。编程是一种亲身体验。这是scanf() 的文档。 msdn.microsoft.com/en-us/library/9y6s16x1.aspx
  • 风格constant != scanf(...)有什么好处?我已经看过两次了,但我仍然无法弄清楚。
  • @Rainning 我通常不使用,但在使用== 时可以防止拼写错误。例如错误的if(x = 1) 仍然是有效的语法,但if(1 = x) 不是,因为你不能为常量赋值。
猜你喜欢
  • 2020-02-23
  • 2020-04-21
  • 1970-01-01
  • 2018-04-02
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
相关资源
最近更新 更多