【问题标题】:Confused about getchar() function对 getchar() 函数感到困惑
【发布时间】:2010-03-09 10:08:18
【问题描述】:

我对@9​​87654321@ 在以下代码中的角色感到困惑。我的意思是我知道它可以帮助我查看输出窗口,该窗口只有在我按下 Enter 键时才会关闭。

所以getchar() 基本上是在等我回车然后读取一个字符。

这个函数正在读取的单个字符是什么?我没有按键盘上的任何键来读取它。

现在当它没有读取任何内容时,为什么它不会给出错误提示“嘿,你没有输入任何内容供我阅读”?

#include <stdio.h>

int main()
{
    printf( "blah \n" );
    getchar();
    return 0;
}

【问题讨论】:

  • getchar() 将无限期地等待,直到按下一个键。它是你的仆人。
  • 欢迎来到stackoverflow!新手问题在这里完全没问题,只要它们是主题性的。你的问题实际上是一个相当不错的问题,因为它解决了一个重要的概念。
  • 请尽量让您的标题接近问题的主题,这将有助于其他正在搜索类似内容的人。我已经编辑了你的标题以反映这个问题。欢迎来到堆栈溢出 :)
  • 感谢您的欢迎 :) 我会记住您所说的关于标题相关性的内容。很高兴我今天找到了这个网站..一直在寻找一个可以快速回答我的问题的网站...我得到的所有答案都非常有帮助..感谢你们所有人:)

标签: c getchar


【解决方案1】:

那是因为 getchar() 是一个阻塞函数。

您应该阅读有关blocking functions 的信息,它基本上使进程等待 发生某些事情。

这种等待行为的实现取决于函数,但通常它是一个等待某个事件发生的循环。

对于getchar() 函数的情况,这可能是作为一个循环来实现的,该循环不断地读取文件(这种情况下的标准输入)并检查文件是否被修改。如果文件被修改,则循环会执行其他操作。

【讨论】:

  • 我想我也会阅读它们。这(基于用户的描述)更像是事件侦听器还是中断(或者两者都不是,我是那个有愚蠢问题的人)?
  • @Anthony:内部实现不同:当你直接访问硬件时(如从串口读取),它通常是中断驱动的。如果您在 GUI 环境中从控制台窗口读取数据,getchar 可能会收到来自 GUI 框架的某种事件。
【解决方案2】:

getchar() 函数将简单地等待,直到它接收到一个字符,让程序一直运行到它接收到为止。

当您按下回车键时会发送一个字符;在 Windows 操作系统下,它将发送回车 (CR) 和换行 (LF)。

请参阅this CodingHorror post 以获得很好的解释。

(……CR+LF部分的解释,不是getchar()阻塞部分)

【讨论】:

  • 感谢您发布链接。
【解决方案3】:

试试这个:

#include <stdio.h>

int main(int argc, char *argv[])
{
    char ch;

    printf("I'm now going to block until you press something and then return... ");

    ch = getchar();

    if (ch >= 0)
       printf("\nYou pressed %c\n", ch);
    else
       printf("\nAliens have taken over standard input! Run!\n");

    return 0;
}

getchar() 将导致您的程序进入睡眠状态,直到收到键盘(或附加到标准输入的任何东西)中断。这意味着它是阻塞的,在getchar() 返回之前不会执行其他代码。

查看函数的返回值有助于理解它。

任何函数都可能阻塞,除非它提供了某种机制来防止阻塞。例如,open() 允许使用 O_NONBLOCK 标志,这有助于打开响应缓慢的设备,如调制解调器。简而言之,如果它从终端获得输入或必须等待从内核或某些设备获得答案,它很有可能会阻塞。

【讨论】:

    【解决方案4】:

    getchar() 会阻止程序的执行,直到按下某个键。因此,如果没有按下任何键,则没有错误,getchar() 将等待它发生:)

    【讨论】:

      【解决方案5】:

      您可以在此处了解有关 getchar 行为方式的更多信息: http://www.cppreference.com/wiki/c/io/getchar ...这应该回答你的问题:)

      【讨论】:

        【解决方案6】:

        我认为让您感到困惑的是在程序继续之前需要 Enter 键。默认情况下,终端会缓冲所有信息,直到按下 Enter,甚至在将其发送到 C 程序之前。

        discussion of Enter problem here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多