关于getchar()、输入缓冲区与EOF运行机制及终端输入问题的问询
getchar()程序终止问题的分析
首先看示例代码:
/* getchar.c */ #include <stdio.h> int main(void) { int c; while ((c = getchar()) != EOF) { putchar(c); putchar(c); } return 0; }
这是C语言书籍中展示getchar()和putchar()用法的示例代码。执行以下操作后出现了两种不同的运行结果:
- 编译命令:
$ gcc getchar.c -o getchar - 生成输入文件:
echo "abc" > input - 重定向输入:
$ ./getchar < input,程序正常终止 - 终端直接输入:执行
$ ./getchar后输入abc,程序无法终止
针对你对该现象的理解,逐一验证并补充关键知识点:
你的理解验证与补充
- 理解1(错误):重定向输入时,文件内容不会和EOF(=-1)一起存入缓冲区。EOF不是实际存储在文件里的字符,它是系统用来标记输入流结束的状态信号,当
getchar()读取到文件末尾时,系统会返回EOF,而非从缓冲区读取到这个值。 - 理解2(正确):当
getchar()读完文件的所有内容后,系统返回EOF,循环条件不满足,程序终止。 - 理解3(正确):通过终端输入
abc并按下回车时,输入的abc加上换行符'\n'会被存入输入缓冲区。 - 理解4(正确但不完整):
getchar()读完'\n'后,缓冲区为空,但此时终端输入流并未关闭,getchar()会进入阻塞状态等待新的输入,而非返回EOF,因此循环会持续运行。
关键补充知识点
- EOF是输入流结束的状态标记,不是实际字符,不会被存储在缓冲区或文件中。只有当输入流被关闭(比如文件读取完毕、终端输入按下
Ctrl+D(Linux/macOS)或Ctrl+Z(Windows)主动发送EOF信号)时,getchar()才会返回EOF。 - 终端输入默认是行缓冲模式:只有按下回车时,输入的内容才会被送入缓冲区供
getchar()读取;如果不主动发送EOF信号,程序会一直等待新的输入。 - 重定向文件输入时,文件采用全缓冲或无缓冲模式,当文件指针走到末尾,系统直接返回EOF,程序因此终止。
内容的提问来源于stack exchange,提问作者Sung-E-gkoght
相关产品推荐
相关产品推荐

