getchar() 并调节循环以中断特定字符
getchar() and conditioning a loop to break with a specific char
我正在编写臭名昭著的书 "Prentice Hall Software Series" 并试用他们编写的代码并对其进行修改以了解有关 C 的更多信息。
我正在控制台中的 Fedora 25 上使用 VIM。下面的代码是书中的引述,我知道缺少 "int" 以及 argc 和 argv 等
Kernighan 和 Ritchie - C 编程语言:第 20 页
#include <stdio.h>
/* 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 条件应该中断并且程序应该终止。好吧,当我尝试 运行 它并输入 'a' 时,它没有。这里有什么问题?
谢谢大家!
代码没有任何问题(除了 main
的陈旧声明)。
通常,在 Unixes 上,文件结束通过 ctrl-D 向程序发出信号。如果您立即或在换行后按 ctrl-D,您的程序将读取 EOF
.
然而,上面简短的解释隐藏了很多微妙之处。
在 Unix 中,终端输入可以以两种模式之一运行(称为 IIRC raw 和 cooked)。在 cooked 模式下 - 默认 - OS 将缓冲来自终端的输入,直到它读取一个新行或一个 ctrl-D 字符。然后它将缓冲的输入发送到您的程序。
最终,您的程序将使用 read
系统调用来读取输入。 read
将 return 读取的字符数,但通常会阻塞,直到它有一些字符要读取。 getchar
然后将它们一一传递给调用者。因此 getchar
将阻塞,直到接收到整行文本,然后再处理该行中的任何字符。 (这就是为什么当你使用 a
时它仍然不起作用的原因)。
按照惯例,read
系统在到达文件末尾时调用 returns 0。这就是 getchar
知道 return EOF
给调用者的方式。 ctrl-D 具有强制 read
读取和清空缓冲区的效果(如果它在新行之后立即发送)这使得它看起来 getchar
就像它已经达到 EOF 即使没有人关闭输入溪流。这就是为什么 ctrl-D 在换行后直接按下但在输入某些字符后按下则不起作用的原因。
我正在编写臭名昭著的书 "Prentice Hall Software Series" 并试用他们编写的代码并对其进行修改以了解有关 C 的更多信息。
我正在控制台中的 Fedora 25 上使用 VIM。下面的代码是书中的引述,我知道缺少 "int" 以及 argc 和 argv 等
Kernighan 和 Ritchie - C 编程语言:第 20 页
#include <stdio.h>
/* 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 条件应该中断并且程序应该终止。好吧,当我尝试 运行 它并输入 'a' 时,它没有。这里有什么问题?
谢谢大家!
代码没有任何问题(除了 main
的陈旧声明)。
通常,在 Unixes 上,文件结束通过 ctrl-D 向程序发出信号。如果您立即或在换行后按 ctrl-D,您的程序将读取 EOF
.
然而,上面简短的解释隐藏了很多微妙之处。
在 Unix 中,终端输入可以以两种模式之一运行(称为 IIRC raw 和 cooked)。在 cooked 模式下 - 默认 - OS 将缓冲来自终端的输入,直到它读取一个新行或一个 ctrl-D 字符。然后它将缓冲的输入发送到您的程序。
最终,您的程序将使用 read
系统调用来读取输入。 read
将 return 读取的字符数,但通常会阻塞,直到它有一些字符要读取。 getchar
然后将它们一一传递给调用者。因此 getchar
将阻塞,直到接收到整行文本,然后再处理该行中的任何字符。 (这就是为什么当你使用 a
时它仍然不起作用的原因)。
按照惯例,read
系统在到达文件末尾时调用 returns 0。这就是 getchar
知道 return EOF
给调用者的方式。 ctrl-D 具有强制 read
读取和清空缓冲区的效果(如果它在新行之后立即发送)这使得它看起来 getchar
就像它已经达到 EOF 即使没有人关闭输入溪流。这就是为什么 ctrl-D 在换行后直接按下但在输入某些字符后按下则不起作用的原因。