c - getchar() 并调节循环以中断特定字符

标签 c getchar kernighan-and-ritchie fedora-25

我正在编写臭名昭著的“Prentice Hall 软件系列”一书,并试用他们编写的代码并对其进行修改,以了解有关 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 的陈旧声明)。

通常,在 Unix 上,文件结束通过 ctrl-D 向程序发出信号。如果您立即或在换行后按 ctrl-D,您的程序将读取 EOF

然而,上面简短的解释隐藏了很多微妙之处。

在 Unix 中,终端输入可以以两种模式之一运行(称为 IIRC raw 和 cooked)。在熟化模式下——默认——操作系统将缓冲来自终端的输入,直到它读取一个新行或一个 ctrl-D 字符。然后它将缓冲的输入发送到您的程序。

最终,您的程序将使用read 系统调用来读取输入。 read 将返回读取的字符数,但通常会阻塞直到它有一些字符要读取。 getchar 然后将它们一一传递给它的调用者。因此 getchar 将阻塞,直到接收到整行文本,然后再处理该行中的任何字符。 (这就是为什么当您使用 a 时它仍然不起作用的原因)。

按照惯例,read 系统调用在到达文件末尾时返回 0。这就是 getchar 知道将 EOF 返回给调用者的方式。 ctrl-D 具有强制 read 读取和清空缓冲区的效果(如果它在新行之后立即发送)这使得它看起来像 getchar 甚至达到了 EOF尽管没有人关闭输入流。这就是为什么 ctrl-D 在换行后直接按下但在输入某些字符后按下则不起作用的原因。

关于c - getchar() 并调节循环以中断特定字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42782905/

相关文章:

c - 为什么代码会进入无限循环

c - char * argv[] 是什么意思?

c - 在 C 程序中求解一对方程给出奇怪的结果

c - 是否需要所有函数参数?

C - printf 无符号整型

c - K&R C 示例中的指针类型不匹配警告

c - gettoken 函数 - 程序不明确 (K&R)

c++ - ASM 堆栈使用

c - getchar() 用于从输入中排除字符

c - 我没有得到想要的 o/p