首页 > 解决方案 > 为什么以下代码在 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 中实现它?

标签: pythoncgetch

解决方案


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

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


推荐阅读