这是我的代码
#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有什么问题,我试图将其卸载并重新安装,但同样会发生问题。
答案 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