【问题标题】:Getch() not reading inputGetch()不读取输入
【发布时间】:2019-04-28 15:06:14
【问题描述】:

我尝试使用 getch() 和 kbhit() 来读取用户的输入,但它似乎没有识别出某个键被按下。

void main(){
    printf("start\n");
    while (1){
        if (kbhit() == 1){
            printf("in\n");
            int k = getch();
            printf("k: %d\n", k);
        }
    }
}

此代码打印“开始”并且在按下键时不打印任何内容。我没有运气使用 getch() 读取和打印一个字符,没有循环。

【问题讨论】:

  • 无法复制。但另一方面,kbhit()getch() 不是标准函数,因此它们的规格可能会有所不同。也许您可以作为第一步使您的代码标准符合int main(void) {return 0; 末尾的main。这些函数kbhit()getch() 是从哪里来的?哪个编译器和平台?
  • 你试过if(kbhit())而不比较1吗?
  • 当前答案是正确的(kbhit 返回非零,即 not 必然与 1 相同)。您也应该检查getch 的文档,因为您当前的逻辑有点奇怪。通常您会使用返回值来检查控制字符并再次调用getch。您还有一个繁忙的循环,它将在您的一个处理器内核上疯狂地旋转。您可能需要在其中添加一个小延迟(例如Sleep(30))以保持理智。
  • 那里有许多名为 WinBGI 和类似名称的库。你的大学不提供文件吗?你确定kbhit() 返回 1 吗?你试过if(kbhit())而不与0比较吗? – 我也使用了 void main() – Visual Sudio 2013 编译与否无关紧要,根据 C 语言标准,它是 int main(void)。请使用它。另外:2018年你为什么用VS2013? Visual Studio 2019 即将发布。
  • ... 所以它应该是if (kbhit()) 并注意getch 返回应该检测到的功能键、光标键等的“转义”值,如果被调用两次。您可以编写一个简单的测试程序来检查这一点。

标签: c getch


【解决方案1】:

发布的代码无法编译!

main() 只有 2 个有效签名,无论 Visual Studio 允许什么:

int main( void )
int main( int argc, char *argv[] )

请注意,它们都返回 int,而不是 void

发布的代码缺少必要的#include 语句

当问一个运行时问题时,就像这个问题一样,发布一个 [mcve] 以便我们可以重新创建问题。

函数:kbhit() 在按下某个键时返回一个非零值(不一定是 1)。

建议:

#include <stdio.h>
#include <conio.h>  // note: this is a nonstandard header
                    // in Windows, so it is not portable
int main( void )
{
    printf("start\n");

    while (1)
    {
        if ( kbhit() )
        {
            printf( "in\n" );
            int k = getch();
            printf( "k: %d\n", k );
        }
    }
}

【讨论】:

  • @Swordfish,从过去几年开始。我不确定成立日期,但至少从 C11 开始。
  • main 是唯一一个不需要显式返回值的非 void C 函数,并且没有编译器警告:)
  • @Swordfish,如果非void函数返回值失败,现代编译器会输出警告信息
  • @Swordfish 最后我检查不返回是 UB。如果你很幸运,你会得到一个错误,但如果你使用 clang,你会得到一个简单的警告和一个无效的指令,谁不喜欢在 C 中处理运行时错误。
  • @vandench 我刚刚检查过。它已从 C99:TC3 更改为 C11。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
相关资源
最近更新 更多