3
#include <stdio.h>

int main() {
    char read = ' ';

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

    return 0;
}

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

4

5 回答 5

7

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

#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”。“输入”还向终端发出信号,表明它应该返回到您的程序。您的程序读取缓冲区并找到 f 并将其放在屏幕上,然后找到一个 '\n' 并立即停止循环并结束您的程序。

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

于 2010-03-17T14:58:29.870 回答
2

getchar() 从输入流中返回下一个字符。这当然也包括换行符等。除非您按“Enter”,否则您看不到循环中的进度这一事实是由于您的文件 I/O(在标准输入上工作)没有移交输入缓冲区到 getchar() 除非它检测到缓冲区末尾的 '\n'。您的例程首先阻止然后一次处理两个击键,像您指定的那样终止,在输入流中出现 '\n' 。Facit:getchar() 不会从输入流中删除 '\n'(为什么要删除?)。

于 2010-03-17T14:11:56.037 回答
1

在 f 之后,您输入“enter”,即“/n”。所以循环在那里结束。如果你想取另一个角色,只要按下 enter 就继续将它们一个接一个地放置,循环退出。

于 2010-03-17T14:08:37.033 回答
1

您已经对其进行了编程,因此当您读取 \n (输入)时循环结束,然后您返回 0; from main 退出程序。

也许你想要类似的东西

 while ((read = getchar()) != EOF) {
        putchar(read);
    }
于 2010-03-17T14:10:52.060 回答
0

n x 终端上,您可以按 Control-D,这将告诉 tty 驱动程序将输入缓冲区返回给正在读取它的应用程序。这就是为什么 ^D 在新行结束输入 - 它导致 tty 返回零字节,应用程序将其解释为文件结尾。但它也适用于线路上的任何位置。

于 2010-03-18T12:44:50.583 回答