【问题标题】:why use EOF to check if stdin buffer is cleared为什么使用EOF检查stdin缓冲区是否被清除
【发布时间】:2016-09-23 18:36:45
【问题描述】:

假设我有以下...

int main () {     
   char name [5] = "";
   char c;
   printf("Enter a name: ");
   fgets(name,5,stdin);
   while ((c = getchar()) != '\n');
   printf("Exiting...);
   getchar();
   return 0;
}

while 循环会清理标准输入缓冲区,但我也看到循环是这样完成的......

while ((c = getchar()) != '\n' && c != EOF);

我想知道两者之间是否有任何区别???测试 EOF 有什么不同吗?

【问题讨论】:

  • 看到fgets 读取newline 反正还有什么要读取的?
  • 没什么...想知道为什么我在其他地方看到它?
  • 再看一遍,char name [5]; 很有可能还有更多要阅读,但如果最后没有newline,则只需清除输入name.
  • 另请注意,fgetc() 返回 int 而不是 char
  • @iharob,你的意思是getchar() 而不是fgetc() :)

标签: c stdin eof


【解决方案1】:

我想知道两者之间是否有任何区别???测试 EOF 有什么不同吗?

是的,测试c != EOF 有很大的不同。 getchar() 在标准输入上检测到错误或文件结尾时返回 EOF。这两者都是完全可能的。一旦getchar() 返回EOF,它很可能会在每次后续调用中再次返回EOF,因此未测试EOF 的版本有陷入无限循环的风险。

【讨论】:

  • 如何在换行符之前获得 EOF?你会点击进入...换行符在EOF之前
  • 一些编辑器,当你创建一个单行文件时,不要换行。或者,在 final 行中去掉换行符。从技术上讲,这是不正确的,但它确实发生了,程序应该能够处理它。
  • @YusufJama,输入可以从不包含换行符的文件重定向。或者输入的名称可能少于五个字符,在这种情况下fgets() 将读取换行符。还有其他可能性。
  • @YusufJama,EOF 之所以存在,是因为您应该针对所有可能性进行编码,而不仅仅是您认为可能的可能性。
  • 或使用损坏的编辑器。或者,IIRC,我不记得具体是哪一个,但是操作系统允许最后一行 not 有换行符。该文件可能已从此类文件中错误地导入/转换。另外,请记住,EOF 也适用于 error,它可能发生在 any 字符上。或者,创建文件的程序先执行for (int i = 1; i <= 10; ++i) fputc(...),然后执行fputc('\n'),但程序员忘记了换行。
猜你喜欢
  • 2014-01-15
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多