【问题标题】:K&R's The C Programming Language: Section 1.5 Character Input and OutputK&R 的 C 编程语言:第 1.5 节字符输入和输出
【发布时间】:2014-04-03 19:01:34
【问题描述】:

定义:一个文本流是一个序列 字符分成几行;每行包含零个或多个字符,后跟一个换行符。此定义逐字逐句来自 K&R。

我正在阅读 K&R The C Programming Language,我对输入和输出的发生方式有些困惑。所以我写了一个小程序来看看它是如何工作的,这就是我得到的:

while 循环获取一个字符并将其保存为char c 然后执行 putchar(c) 以此类推,直到我点击返回(结束 文本流),让我感到困惑的部分是:当我键入输入 文本流时,putchar(c) 没有t 似乎正在工作(肯定不会在循环的每次迭代中打印c),但是一旦我点击返回,我就会返回我输入的内容。

我认为以下情况正在发生,但我希望有人可以确认或更正。只要我在命令提示符的第一行执行inputOutput.exe,它就会设置为接收输入文本流(这不是程序的结果,而是命令提示符的工作方式。 ) 当我在命令提示符中输入文本时,每个字符都被putchar(c) 发送到“输出文本流”,但是在我按下键盘上的回车键之前,该流在命令提示符中不可见,此时命令Prompt 结束输入模式,然后执行最后一个 putchar(c),它调用当前输出 文本流 以显示在命令提示符上。如果这是正确的,那么在我看来,代码表现本身的方式是受命令提示符规则的约束,而不是受 C 语言的约束,这是正确的吗?

【问题讨论】:

    标签: c input output


    【解决方案1】:

    这是输入行缓冲的产物。许多控制台/程序都这样做,有时甚至允许高级输入编辑。尝试将您的控制台/程序置于直接模式/无缓冲。

    【讨论】:

    【解决方案2】:

    putchar(c) 没有立即在屏幕上显示字符的原因是缓冲。 您可以添加:

    fflush(stdout);
    

    紧接着

    putchar(c);
    

    输出会更有意义。

    您也可以关闭缓冲,但通常您希望将其打开。

    您想要缓冲的原因是,如果您要写出大量数据,C-runtime 会更快地缓冲文本并一次将其全部刷新(或一次一个缓冲区) .

    对于 C 语言中的 UI 类型的程序来说,这样做是正常的:

    printf(... printing things);
    printf(... printing some more things);
    ...
    fflush(stdout); /* at this point everything will be seen by user */
    

    【讨论】:

    • 我尝试将fflush(stdout); 放在循环的末尾,但它的行为仍然相同。
    • 我认为 getchar() 实际上会在返回第一个字符之前等待您按回车键。尝试将 'getchar()' 替换为 'getch()' (注意,您在键入时可能看不到屏幕上的字符)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多