【问题标题】:Why does this C code have unexpected behavior为什么此 C 代码有意外行为
【发布时间】:2012-03-09 14:41:16
【问题描述】:

我编写了以下简单的 C 代码,可以正常编译和运行。但是它的行为方式我不明白。我输入一个字符,它会在屏幕上打印出来。但是当我按下回车键时,它会打印整行。因此,如果我键入字母 a、b 和 c,abc 会在命令行上打印两次。为什么要这样做?

#include <stdio.h>


int main(){


    int c;
    while((c=getchar())!=EOF){
        putchar(c);
    }

return 0;

}

【问题讨论】:

    标签: c getchar putchar


    【解决方案1】:

    因为您的终端是行缓冲的。

    在遇到换行符之前,它不会向您的程序发送数据,尽管它会将字符回显到屏幕上,以便您可以看到您按下的键。

    【讨论】:

      【解决方案2】:

      这是您的终端,而不是程序。

      当您按下一个键时,您的终端会打印它,但不会将它传递给程序。

      当你按下回车键时,终端将整行传递给程序,程序打印该行。

      编辑:如果您使用 Unix/Linux/etc,您可以编写 stty -icanon -echo 来禁用该终端行为。 -echo 关闭打印,-icanon 关闭缓冲。

      【讨论】:

        【解决方案3】:

        您所看到的是几件事情的组合。

        1. 当您键入一个字符时,除非您明确阻止它发生,否则它将打印到屏幕上。
        2. 在打印新行之前,大多数打印语句实际上不会打印任何内容。

        因此,您看到的文本来自 type 命令,但打印的 putchar() 字符串是同时发生的。

        【讨论】:

          【解决方案4】:

          您正在从行缓冲的标准输入流中读取数据。

          试试这个备用代码,你会更好地理解发生了什么:

          #include <stdio.h>
          int main(){
              int c;
              while((c=getchar())!=EOF){
                  printf("got char %c\n", c);
              }
              return 0;
          }
          

          您需要非行缓冲输入。这将取决于您的平台,但这是 Linux 上的答案:non-buffering stdin reading

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-02
            相关资源
            最近更新 更多