【问题标题】:How to have a maximum waiting time for getchar in C如何在 C 中设置 getchar 的最大等待时间
【发布时间】:2016-12-07 07:46:27
【问题描述】:

我正在使用 C 语言编写一个项目,在 Windows 中使用 CodeBlocks,其中我在控制台中显示了一些移动字符(我不想使用图形功能)。为此,我打印字符并稍等片刻,然后使用 system(cls) 并移动字符的位置,然后再次打印字符,所以它看起来像在移动。

我要补充的是:如果用户按下上键,字符会向上移动,否则它们会继续移动。我尝试使用 getchar(),但问题是它等待确保命中一个字符,没有任何超时。因此,如果没有击中,程序将停止显示移动的字符。有没有办法为 getchar 添加超时功能或使用不同的方法?

【问题讨论】:

  • 我不确定,但我认为您应该将 STDIN 重定向到一个文件并尝试读取该文件。
  • 看看select。您可以为输入提供超时,但您可能需要将键盘置于原始、无缓冲模式。
  • 您可能希望为此使用一些非标准的控制台 API。纯标准 C 太粗了。
  • @DavidC.Rankin select 在 Windows 上不能很好地工作是真的吗?
  • 亲爱的,感谢您的 cmets。我编辑了我的问题以澄清我在 Windows 中使用 CodeBlocks。 @Lundin:请您澄清更多,或给出提示,例如,..

标签: c


【解决方案1】:

没有可移植的方式来做到这一点。

在符合 Posix 的系统上,您可以使用带有超时的select() 来检查系统句柄 0(进程标准输入)是否有可用的输入。然后,您可以使用read 获取待处理的输入。

【讨论】:

    【解决方案2】:

    在 Windows 中,您可以使用旧的 <conio.h> 函数:

    但使用这些功能并不是真正可移植的。你可以使用ncurses 之类的东西来做你想做的事。对于 Windows,有一个很好的库:PDCurses

    【讨论】:

      【解决方案3】:

      您可以尝试使用 setvbuf 将缓冲区与标准输入相关联,然后查看缓冲区的内容以检查用户是否输入了任何内容,而不是调用 getch

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-13
        • 1970-01-01
        • 2017-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多