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

Pie*_*ter 3 c getchar

#include <stdio.h>

int main() {
    char read = ' ';

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的输入是f(当然是输入).我希望getchar()再次请求输入,但程序终止.怎么会?我怎样才能解决这个问题?

Luc*_*cas 7

终端有时会有点混乱.您应该将程序更改为:

#include <stdio.h>

int main() {
    int read;
    while ((read = getchar()) != EOF) {
        putchar(read);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这将读取直到getchar从终端读取EOF(大多数时候此宏扩展为-1).getchar返回一个int,因此你应该将变量'read'变成一个整数,这样你就可以检查EOF.您可以使用^ D从Linux上的终端发送EOF,我想在带有^ Z(?)的Windows上.

稍微解释会发生什么.在你的程序中表达

(read = getchar()) !='\n'
Run Code Online (Sandbox Code Playgroud)

只要没有从缓冲区中读取'\n',它就是真的.问题是,要将缓冲区添加到程序中,必须按Enter键对应'\n'.在终端中调用程序时,会发生以下步骤:

~$\a.out
Run Code Online (Sandbox Code Playgroud)

这开始你的程序

(empty line)                    
Run Code Online (Sandbox Code Playgroud)

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

f                   
Run Code Online (Sandbox Code Playgroud)

你在终端做了一个输入.'f'被写入缓冲区并在终端上回显,你的程序还不知道该字符.

f
f~$                 
Run Code Online (Sandbox Code Playgroud)

你点击进入.你的缓冲区现在包含'f \n'.'enter'也向终端发出信号,它应该返回你的程序.你的程序读取缓冲区并找到f并将其放到屏幕上,然后找到一个'\n'和immediatley停止循环并结束你的程序.

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