getchar()并调整一个循环来打破特定的char
我正在研究臭名昭着的书“Prentice Hall软件系列”并试用他们编写的代码并对其进行修改以了解有关C的更多信息。
我正在控制台上使用Fedora 25上的VIM。 以下代码是本书的引用,我知道“int”缺失以及argc和argv等。
Kernighan和Ritchie – C编程语言:第20页
#include /* copy input to output; 1st version */ main(){ int c; c = getchar(); while (c != EOF) { putchar(c); c = getchar(); } }
使用此代码,我无法让“EOF”工作。 我不确定“ctr + z”是否真的是真的要做,因为它退出了控制台中的任何控制台程序。
好吧,因为我不确定我改变了条件
... while (c != 'a') { ...
所以通常如果我输入’a’,while条件应该中断并且programm应该终止。 好吧,当我尝试运行它并输入’a’时它不会。 这里有什么问题?
感谢你们!
代码没有错(除了main
的古老声明)。
通常,在Unix上,文件末尾通过ctrl-D向程序发出信号。 如果您直接点击ctrl-D或点击新线后,您的程序将读取EOF
。
但是,上述简短的解释隐藏了许多细微之处。
在Unix中,终端输入可以以两种模式之一运行(称为IIRC raw和cooked)。 在熟模式 – 默认情况下 – 操作系统将缓冲来自终端的输入,直到它读取新行或ctrl-D字符。 然后它将缓冲的输入发送到您的程序。
最终,您的程序将使用read
系统调用来读取输入。 read
将返回read
的字符数,但通常会阻塞,直到有一些字符要读取。 getchar
然后将它们一个接一个地传递给它的调用者。 因此,在处理该行中的任何字符之前, getchar
将阻塞直到收到整行文本。 (这就是为什么当你使用a
时它仍然无效)。
按照惯例, read
系统调用在文件结束时返回0。 这就是getchar
知道将EOF
返回给调用者的方式。 ctrl-D具有强制read
读取和清空缓冲区的效果(如果它在新行之后立即发送),这使得它看起来像getchar
就像它达到了EOF,即使没有人关闭输入流。 这就是为什么ctrl-D在新行之后直接按下而不是在输入一些字符后按下它时的效果。