关于未读取外部文件时EOF工作机制的技术问询
关于K&R那段输入复制代码的EOF触发问题
哈哈,这个坑我刚学C的时候也踩过!你提到的这段经典K&R代码:
#include <stdio.h> main() { int c; while ((c = getchar()) != EOF) putchar(c); }
确实是实现“输入啥就输出啥”的功能,但你遇到的情况太正常了——当你在终端手动敲内容时,输入流不会因为你停手就自动触发EOF,因为终端默认是行缓冲模式,它得等你明确告诉它“我输入完了”才会给程序传递EOF信号。
为啥输入停了循环还不停?
你在终端输入的内容会先存在系统的缓冲区里,getchar()是从这个缓冲区里读数据的。如果只是停止输入,程序会一直等着你继续敲内容,根本不知道你已经不想输入了。只有当系统收到明确的EOF指令,才会让getchar()返回EOF值,循环才会终止。
怎么手动发送EOF信号?
不同操作系统的操作不一样:
- Windows:在终端里按下
Ctrl + Z,然后敲回车,就能发送EOF。 - Linux/macOS/Unix:直接按下
Ctrl + D就行,不用回车,按下去程序就会终止。
额外说一句
要是你用这段代码读外部文件,比如通过命令行重定向输入(比如 ./your_program < test.txt),那文件读完的时候系统会自动触发EOF,程序会正常结束,不用手动发信号。文档里说的“输入结束时循环终止”其实包含了这种文件输入的情况,而咱们手动在终端输入属于交互式输入,就得主动告诉系统“我输完了”才行。
内容的提问来源于stack exchange,提问作者Agrudge Amicus
相关产品推荐
相关产品推荐

