为什么以下代码在 C 中给出不同的输出,Python?

why does following code give different output in C , Python?

我想在Unix中实现$cat的输入获取过程。在无限循环中,每当我按下任意键时,相应的字母就会打印在屏幕上。如果我按 ctrl+d,循环将终止。

这个 TurboC 代码完全符合我的要求:

#include<stdio.h>
#include<conio.h>

void main()
{
    char ch;
    while(1)
    {
        ch = getch();
        if(ch == 4)
            break;
        else
            printf("%c", ch);
    }
}

但每当我切换到 Python3 时,就会出现问题。

from msvcrt import getch

while True:
    ch = getch()
    if ord(ch) == 4: break
    else: print(ch.decode(), end="")

当程序进入无限循环时,它不打印任何东西,但我在按键。最后,当我按下 ctrl+d 时,所有之前输入的字符都被打印在一起了。

如何在 Python 中实现它?

问题是 Python 中的输出被缓冲,除非您按照@AlbinPaul 的建议用 sys.stdout.flush()print(ch.decode(), end="", flush=True) 刷新它。如果您使用 std::cout 而不是 printf,您可能会遇到与 C++ 相同的问题。这背后的想法是每个 input/output 操作都非常昂贵,因此如果您立即将每个字符一个一个地输出到输出设备,您会观察到性能下降。将输出保存在内存中并时不时刷新累积的输出要便宜得多,因此大多数高级语言选择缓冲输出。

如果您需要实时交互(就像您的情况),有时这种缓冲会带来问题。另一个可能臭名昭著的问题是竞争性编程:不要忘记刷新你的输出,否则你会达到时间限制。