2
#include <stdio.h>
main()
{
    int c;
    c = getchar();
    while(c != EOF)
        {
        putchar(c);
        c = getchar();
        }
    return 0;
}

将输入复制到输出程序如何工作?根据我在第一次 getchar() 执行时开始时返回一个字符值并将其存储在 c 变量中。现在,当执行循环时,编译器检查 c 是否等于 EOF,如果发现它不等于,则循环开始工作并读取下一条语句,现在它执行 putchar()“当时为什么编译器不打印存储在c 变量而不是首先编译器读取所有字符然后打印这些字符“为什么?

4

1 回答 1

2

如果我对您的理解正确,您的意思是在程序运行时,您在执行时看不到单个putchar(c);调用的结果。相反,您会看到输出集中在一起。你说你只在“最后”看到这一切,但我怀疑你在按下回车时实际上在每一行都看到了这一切。

到终端的正常标准输出缓冲要写入的字符。也就是说,当您输出某些内容时,该输出不会被传递到系统进行实际输出,直到缓冲区被刷新的某个点。在这种情况下,回车(行尾)将刷新缓冲区;尝试从同一通道读取输入将刷新缓冲区,关闭通道(退出程序)将刷新缓冲区。这样做的目的是提高性能,因为仅打印单个字符非常慢,而打印整个缓冲区的速度几乎相同(执行一次,而不是每个字符一次)。

如果要手动刷新标准输出缓冲区,可以fflush(stdout);在 putchar 调用之后包含。

或者,您可以通过完全禁用缓冲setvbuf(stdout, NULL, _IONBF, 0);

编辑:正如@JonatanGoebel 指出的那样,您在getchar();呼叫和输入通道上也有缓冲情况。你不能只刷新那个通道,但你可以禁用它的缓冲。如果它仍然处于缓冲状态,则输入将不会进入您的程序,直到其中有回车(此时,每个连续的字符都getchar()将返回缓冲区中的下一个字符,直到您用尽它,然后调用必须等待下一个缓冲区填写)。

于 2013-10-14T11:24:26.773 回答