C语言中getchar()里EOF(Ctrl+D)的用法疑问
K&R第1.9节代码中EOF用法的疑问解答
我正在学习K&R第1.9节,无法理解以下代码中EOF的用法。
#include <stdio.h> #define MAXLINE 1000 /* maximum input line length */ int mymygetline(char line[], int maxline); void copy(char to[], char from[]); /* print the longest input line */ int main() { int len; /* current line length */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ max = 0; while ((len = mymygetline(line, MAXLINE)) > 0) { if (len > max) { max = len; copy(longest, line); } } if (max > 0) /* there was a line */ printf("%s", longest); return 0; } /* mymygetline: read a line into s, return length */ int mymygetline(char s[], int lim) { int c, i; for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) s[i] = c; if (c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; } /* copy: copy 'from' into 'to'; assume to is big enough */ void copy(char to[], char from[]) { int i; i = 0; while ((to[i] = from[i]) != '\0') ++i; }
我尝试的操作
- 程序处理带换行符
\n的不同输入行时运行正常,这部分容易理解 - 当我首次在行内输入EOF时,它仅结束当前输入流,使
getchar()进入等待输入的状态
我的问题
- 当我连续在行内输入两次EOF时,第一次EOF是否只是起到类似
\n的作用,还是存在其他机制?我是不是忽略了什么?
核心解释
首先得明确:EOF不是一个可输入的字符,它是getchar()等函数在输入流结束时返回的一个特殊值(通常定义为-1)。你在终端输入的"EOF"其实是终端提供的快捷键(比如Linux/macOS的Ctrl+D,Windows的Ctrl+Z),用来模拟输入流结束的信号。
第一次输入EOF的行为
当你第一次按下EOF快捷键时,终端会把当前输入缓冲区里的内容全部发送给程序,然后标记输入流暂时"结束"——但此时如果程序继续调用getchar(),终端会重新开启输入等待,这就是你看到的getchar()等待输入的原因。
这时候,你的mymygetline函数会把缓冲区里的内容(如果有的话)读取完,然后因为getchar()返回EOF,循环终止。但因为此时c等于EOF,不会执行处理\n的分支,直接给字符串加\0,返回当前的i(也就是读取到的字符数)。如果此时读取到的字符数大于0,主函数的循环会继续执行,再次调用mymygetline,这时候getchar()就会等待新的输入。
连续两次输入EOF的行为
第一次EOF发送了缓冲区内容并暂时终止流,第二次EOF则是真正告诉终端:输入流彻底结束,没有更多内容了。这时候getchar()会直接返回EOF,而且后续再调用getchar()都会一直返回EOF。
这时候mymygetline函数的循环一开始就会因为c=getchar()等于EOF而终止,此时i还是0,返回0,主函数的while循环条件len>0不满足,循环退出,程序执行后续逻辑。
你可能忽略的点
- EOF是流结束标记,不是字符,不存在"输入EOF字符"的说法,你操作的是终端的流结束快捷键。
- 第一次EOF只是清空当前输入缓冲区并触发一次流结束,但程序如果继续读取,终端会允许继续输入;第二次EOF才是彻底关闭输入流,让后续的
getchar()永远返回EOF。 - 对比
\n:\n是换行字符,会被getchar()读取并作为正常字符处理,而EOF是函数返回的特殊值,不会被存入字符串中。
内容的提问来源于stack exchange,提问作者Hiểu Nam
相关产品推荐
相关产品推荐

