【问题标题】:Understanding Input and Output in C理解 C 中的输入和输出
【发布时间】:2016-01-15 15:32:51
【问题描述】:

考虑以下代码:

while ((c = getchar()) != EOF)  // c is of char type 
      putchar(c);

getchar 键盘检索一个char。但是当我观察它的执行时,注意到putchar 的输出直到getchar 遇到ENTER key 才会发生。所以getchar 直到ENTER 键才真正检索整个字符串。

实际输出:

Hello 
Hello 

想要的输出:

H
H
E
E
L
L
O
O

【问题讨论】:

  • 我想你会喜欢这篇文章(及其相关文章):stackoverflow.com/questions/13104460/… 你的“H E E L O O”示例是关于它如何工作的合理理论。如答案中所述,缓冲可以防止这种交错。事实证明,您可以设置一些选项,这些选项应该会给您“H H E L L O O”。在您了解它们之前,“原始”与“缓冲”的概念词并不明显。快乐的研究。 :-)
  • 感谢您的链接。

标签: c input io output


【解决方案1】:

流是缓冲的,'\n' 字符会刷新缓冲区,所以是的,你需要按 enter 让字符开始“flushing”。

另外,// c is of type char 是错误的,因为此时无法表示 EOFgetchar() 函数返回 int,所以 c 必须是 int 类型,否则 c 可能会溢出。

【讨论】:

  • 好的。但是即使流被缓冲,getchar 也需要从缓冲区中读取一个字符,从而导致真正的 while 循环和输出相同的字符,然后缓冲区中的指针移动到下一个字符,从而产生所需的输出!
【解决方案2】:

当您输入字符串Hello 时,它会进入键盘缓冲区。按下 Enter/Reurn 按钮后,此字符流将进入标准输入缓冲区,getchar 从那里一一读取。

注意getchar 返回int,所以c 应该是int 类型。

【讨论】:

    【解决方案3】:

    getchar() 不直接从键盘读取击键;它从 输入流 中读取字符,该输入流被缓冲,因此输入不会发送到您的程序,直到您按下 Enter

    如果您需要在键入时读取单个击键,那么最好使用特定于平台的实用程序,例如 ncurses 库中的 getch 函数。

    【讨论】:

      猜你喜欢
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      相关资源
      最近更新 更多