在 while(getchar() != '\n'); 中用 fgetc 或 getc 替换 getchar

Replacing getchar with fgetc or getc in while(getchar() != '\n');

人们通常会提到

while( getchar() != '\n' )

当涉及到清除输入缓冲区或溢出时。

fgetcgetc 也可以。例如:

while( fgetc(stdin) != '\n' )

while( getc(stdin) != '\n' )

人们总是使用 getchar 有什么特别的原因吗?

使用fgetcgetc有什么缺点吗?

人们更喜欢 getchar 只有在他们从标准输入读取的情况下。当需要从文件中读取时,没有理由不将其替换为 getc/fgetc

话虽如此,该构造是危险的,因为在输入流中没有 '\n' 的情况下,它会导致无限循环。例如,如果最终用户使用 Ctrl+DCtrl+[=21 关闭流=]Z,像你这样的带有while循环的程序将永远不会退出。您需要在忽略输入的循环中检查 EOF

int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
  • 如果您知道自己正在阅读 stdin,请使用 getchar
  • 如果您正在从任意文件指针读取,请使用 getc
  • 如果出于某些不明确的原因您需要确保调用的是实际函数而不是宏,请使用 fgetc。 (对我来说,这些原因是如此晦涩,以至于我从不调用 fgetc,我建议使用 getc。)