所以我开始使用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)char是某种结束流的信号,它必须在getchar()
的新行上才能返回EOF
。虽然这一切都很好,但它有点帮助我真的想知道为什么EOF
必须独立?
答案 0 :(得分:4)
您遇到的问题与命令行终端有关,与文件结束标记本身无关。在您输入字符时,大多数终端都会等到您完成整行后才将其输入的内容发送到程序中。
您可以通过输入来自文本文件而不是手动输入来测试。您应该能够在没有换行的情况下结束输入文件而没有任何问题。
./myprogram.exe < input.txt
顺便说一下,你链接的答案也指出EOF不是你输入流中实际存在的字符,因此在&#34;之前没有办法来#34; a&#34; \ n&#34;。 EOF只是在没有剩余字符要读取时getchar
返回的值。
答案 1 :(得分:3)
当从tty设备读取时(例如在控制台或终端窗口中运行的程序的stdin),终端处于所谓的cooked mode。在此模式下,提供了某种级别的行编辑工具,允许用户退格并更改已键入的内容。
在按下return之前,键入的字符不会返回到程序。
可以通过将终端设置为“原始”模式来完成此操作。不幸的是,它似乎没有很好地标准化,所以它有点系统特定。 this question的答案有各种平台的例子。