在 while(getchar() != '\n'); 中用 fgetc 或 getc 替换 getchar
Replacing getchar with fgetc or getc in while(getchar() != '\n');
人们通常会提到
while( getchar() != '\n' )
当涉及到清除输入缓冲区或溢出时。
fgetc
或 getc
也可以。例如:
while( fgetc(stdin) != '\n' )
和
while( getc(stdin) != '\n' )
人们总是使用 getchar
有什么特别的原因吗?
使用fgetc
或getc
有什么缺点吗?
人们更喜欢 getchar
只有在他们从标准输入读取的情况下。当需要从文件中读取时,没有理由不将其替换为 getc
/fgetc
。
话虽如此,该构造是危险的,因为在输入流中没有 '\n'
的情况下,它会导致无限循环。例如,如果最终用户使用 Ctrl+D 或 Ctrl+[=21 关闭流=]Z,像你这样的带有while
循环的程序将永远不会退出。您需要在忽略输入的循环中检查 EOF
:
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
- 如果您知道自己正在阅读
stdin
,请使用 getchar
。
- 如果您正在从任意文件指针读取,请使用
getc
。
- 如果出于某些不明确的原因您需要确保调用的是实际函数而不是宏,请使用
fgetc
。 (对我来说,这些原因是如此晦涩,以至于我从不调用 fgetc,我建议使用 getc
。)
人们通常会提到
while( getchar() != '\n' )
当涉及到清除输入缓冲区或溢出时。
fgetc
或 getc
也可以。例如:
while( fgetc(stdin) != '\n' )
和
while( getc(stdin) != '\n' )
人们总是使用 getchar
有什么特别的原因吗?
使用fgetc
或getc
有什么缺点吗?
人们更喜欢 getchar
只有在他们从标准输入读取的情况下。当需要从文件中读取时,没有理由不将其替换为 getc
/fgetc
。
话虽如此,该构造是危险的,因为在输入流中没有 '\n'
的情况下,它会导致无限循环。例如,如果最终用户使用 Ctrl+D 或 Ctrl+[=21 关闭流=]Z,像你这样的带有while
循环的程序将永远不会退出。您需要在忽略输入的循环中检查 EOF
:
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
- 如果您知道自己正在阅读
stdin
,请使用getchar
。 - 如果您正在从任意文件指针读取,请使用
getc
。 - 如果出于某些不明确的原因您需要确保调用的是实际函数而不是宏,请使用
fgetc
。 (对我来说,这些原因是如此晦涩,以至于我从不调用 fgetc,我建议使用getc
。)