为什么我的代码在Visual Studio中不起作用?

时间:2018-11-11 16:03:49

标签: c++ visual-studio

这是我的代码

#include <conio.h>
#include <iostream>

using namespace std;

int main() {
    bool a = false;
    char b='p';
    int c=0;

    while (a != true) {
        if (_kbhit()) {
            b = _getch();
        }
        if (b=='w') {
            c++;
            cout << c << " ";
       }
        else if (b == 'c') {
            cout << "hello";
        }
    }
    system("pause");
    return 0;
}

问题是当我按'w'时我想让它打印出c的值,并且应该一直重复直到我按_kbhit()的另一个输入,对吗?因为现在它在c上加1,然后打印c,当我再次按w时也是如此。我正在使用社区2017的Visual Studio有什么问题,我试图将其卸载并重新安装,但同样会发生问题。

2 个答案:

答案 0 :(得分:0)

程序似乎按照您想要的方式运行。如果按“ w”,它将进入无限循环,增加c的值并打印。按任何其他键将停止打印,而按'c'会在同一无限循环中进行并打印hello。就发布的代码而言,似乎没有任何问题。另外,我想说的与@Someprogrammerdude相同,如果它可以编译,但不按照您希望的方式运行,则是代码问题,而不是IDE和/或编译器。

假想的答案:您的计算机可能一直以为按键被按下,因此kbhit()始终返回true。这可能是由错误的鼠标/键盘/控制器驱动程序和/或配置引起的。该代码很好,您的PC却不是。

答案 1 :(得分:0)

您遇到的问题似乎是由于_getch() / _kbhit中最近添加的错误导致的。

对于扩展键(例如,光标键),已记录_getch()返回0x0或0xe0,然后返回实际按下的键的扫描代码。 记录的内容是,如果用户按下非扩展键,_kbhit仍将连续两次返回true,而对_getch()的调用将返回第一次输入密码,第二次输入0x0。

在您的代码中,当用户按下'w'或'c'时,_kbhit将返回true不仅一次(如您所愿),而且还会返回两次 。第一次调用它,它将返回密钥的扫描代码,第二次它将返回一个0字节。

您的代码中正在发生的事情是,您正在读取扫描代码,适当地进行打印,然后_kbhit再次返回true,因此您读取了'\ 0'字节,设置了{{ 1}}到'\ 0',然后(由于b为0时您没有任何代码可以执行任何操作),您(反复地)在用户下次按下按键之前不执行任何操作。

参考

https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/getch-getwch?view=vs-2017