【发布时间】:2014-08-20 19:05:21
【问题描述】:
所以我开始使用 ANSI C 书来学习 C。本书的早期练习之一是编写一个程序,该程序接受文本输入并将每个单词打印在新的一行,非常简单。所以我做到了:
#include <stdio.h>
#define IN 1
#define OUT 0
main() {
int c;
int state;
state = OUT;
while((c = getchar()) != EOF){
if(c != ' ' && c != '\n' && c != '\t'){
state = IN;
}else if(state == IN){
state = OUT;
putchar('\n');
}
if(state == IN)
putchar(c);
}
getchar();
}
问题是,虽然程序运行良好,但如果我输入 EOF(Windows 上的 Ctrl+Z) 作为一行的最后一个字符或在它的中间,它不会中断 while 循环。
所以我找到了答案here。
我学到的是 (Ctrl+Z) 字符是结束流的某种信号,它必须位于新行上,getchar() 才能返回EOF。虽然这一切都很好,而且有点帮助,但我真的很想知道为什么 EOF 有必要独立运行?
【问题讨论】:
-
几周前我们有一个类似的问题,我找不到任何参考资料。但据我所知,对于大多数类 UNIX 终端来说,
^D刷新输入缓冲区,如果刷新,则发送 EOF;换行符也会刷新缓冲区。也许这对于 Windows 也是一样的(使用^Z而不是^D)? -
另请注意,您的最后一个
getchar();永远无法读取任何内容(当您退出循环时,最后一个getchar调用返回EOF)。 -
@mafso 最后一个
getchar()用于保持控制台打开,仅此而已。 -
这行得通(只是出于好奇,我不熟悉 Windows 控制台)?