c - 为什么这个 getchar() 循环在输入一个字符后停止?

标签 c getchar

#include <stdio.h>

int main() {
    char read = ' ';

    while ((read = getchar()) != '\n') {
        putchar(read);
    }

    return 0;
}

我的输入是 f(当然后面跟着一个 enter)。我希望 getchar() 再次要求输入,但程序已终止。怎么来的?我该如何解决这个问题?

最佳答案

终端有时会有点困惑。您应该将程序更改为:

#include <stdio.h>

int main() {
    int read;
    while ((read = getchar()) != EOF) {
        putchar(read);
    }
    return 0;
}

这将一直读取,直到 getchar 从终端读取 EOF(大多数情况下该宏扩展为 -1)。 getchar 返回一个 int 所以你应该把你的变量“读”成一个整数,这样你就可以检查 EOF。您可以在 Linux 上使用 ^D 从您的终端发送 EOF,我认为在 Windows 上使用 ^Z (?)。

稍微解释一下发生了什么。在你的程序中表达

(read = getchar()) !='\n'

只要没有从缓冲区中读取 '\n' 就会为真。问题是,要为您的程序获取缓冲区,您必须按对应于“\n”的回车键。 当您的程序在终端中被调用时,会发生以下步骤:

~$\a.out

这将启动您的程序

(empty line)                    

getchar() 进行系统调用以从终端获取输入,终端接管

f                   

您在终端中进行了输入。 'f' 被写入缓冲区并在终端上回显,您的程序还不知道该字符。

f
f~$                 

您按下回车键。您的缓冲区现在包含“f\n”。 'enter' 也向终端发出信号,它应该返回到您的程序。你的程序 读取缓冲区并找到 f 并将其放到屏幕上,然后找到 '\n' 并立即停止循环并结束程序。

这是大多数终端的标准行为。您可以更改此行为,但这取决于您的操作系统。

关于c - 为什么这个 getchar() 循环在输入一个字符后停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2462728/

相关文章:

我可以使用字符串作为#define 的常量部分吗?

c++ - poll返回0但read不阻塞

c - 在 C 中生成两个独立播种的随机数列表

c - 如何修复 - 使用 getchar() 和 do-while 的意外输出

c - 如何模拟 EOF?

c - 在命令提示符下生成一个 "readable"退格键

c - realloc 无法重新分配先前 malloc 的指针

c - 为什么我的 getchar() 在这里不起作用?

c - 在C中添加到链表的尾部

C - 如何找到之前由 tmpfile() 创建的临时文件?