于是我开始用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();
}
问题是,虽然程序运行良好,但如果我输入,它不会从 while 循环中中断EOF
(在 Windows 上按 Ctrl+Z)作为行的最后一个字符或在行的中间。
所以我找到了答案here https://stackoverflow.com/questions/11944314/ctrl-d-didnt-stop-the-whilegetchar-eof-loop.
我了解到的是 (Ctrl+Z) 字符是某种结束流的信号,它必须位于新行上getchar()
回来EOF
。虽然这一切都很好,而且有点帮助,但我真的想知道为什么有必要EOF
独行?
您遇到的问题与命令行终端有关,与文件结尾标记本身无关。大多数终端不会在您键入字符时将字符发送到程序,而是会等到您完成整行后再将键入的内容发送到程序。
您可以通过让输入来自文本文件而不是手动输入来测试这一点。您应该能够在没有换行符的情况下结束输入文件,不会出现任何问题。
./myprogram.exe < input.txt
顺便说一句,您链接到的答案还指出 EOF 并不是输入流中实际存在的字符,因此它无法出现在“\n”“之前”。 EOF 只是这个值getchar
一旦没有剩余字符可供读取,则返回。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)