如何将输入复制到输出程序?

时间:2013-10-14 11:10:50

标签: c

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

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

1 个答案:

答案 0 :(得分:2)

如果我理解正确,那么你说在程序运行时你没有看到执行时{@ 1}}个别调用的结果。相反,你看到输出集中在一起。你声明你只是“在最后”才能看到它,但我怀疑你在按下回车符时每条线都看到了它。

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

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

或者,您可以通过fflush(stdout);

完全禁用缓冲

编辑:正如@JonatanGoebel指出的那样,setvbuf(stdout, NULL, _IONBF, 0);电话和输入频道也有缓冲情况。您不仅可以刷新该频道,还可以禁用该频道。如果它保持缓冲状态,则输入将不会到达您的程序,直到其中有回车符(并且在此时,每个连续的getchar();将返回缓冲区中的下一个字符,直到您耗尽它并且然后必须调用等待下一个缓冲区填满)。