C++ — 使用 getch() 的箭头键按下检测莫名其妙地打印了一些单词
C++ — Arrow key press detection with getch() prints some words inexplicably
我有一个简单的程序可以检测用户的箭头键按下,但我有两个问题。但首先,这是代码:
#include <iostream>
#include <conio.h>
#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_LEFT 77
#define KEY_RIGHT 75
using namespace std;
int main()
{
while(1)
{
char c = getch();
cout << "Hello";
switch(c) {
case KEY_UP:
cout << endl << "Up" << endl;//key up
break;
case KEY_DOWN:
cout << endl << "Down" << endl; // key down
break;
case KEY_LEFT:
cout << endl << "Right" << endl; // key right
break;
case KEY_RIGHT:
cout << endl << "Left" << endl; // key left
break;
default:
cout << endl << "NULL" << endl; // any other key
break;
}
}
return 0;
}
问题 1:为什么我按任意方向键时,为什么会打印 "Hello" 两次?
问题 2:每当我按任何箭头键或非箭头键时,它都会打印默认的开关盒 "NULL",这应该仅适用于非箭头键。这是为什么?
谢谢
当使用 conio
和 getch
读取键时,为了能够处理特殊键(箭头键、功能键),同时仍将其 return 值放入 char
, getch
returns 特殊键作为两个-char
序列。第一次调用returns 0
,第二次调用returns特殊键的代码。 (否则,您的 KEY_DOWN
- ASCII 80 - 本身就是 'P'。)
将所有这些放在一起的一种方法如下所示:
char c = getch();
if (c == 0) {
switch(getch()) {
// special KEY_ handling here
case KEY_UP:
break;
}
} else {
switch(c) {
// normal character handling
case 'a':
break;
}
}
您可以通过打印 _getch() 的输出来检查自己。对于箭头键,您需要调用它两次,因为箭头键 return 有两个值。第一个值取决于数字锁。
#include <iostream>
#include <conio.h>
void Input() {
if (_kbhit()) {
if(_getch()==224)
switch (_getch())
{
case 72:
printf("up arrow\n");
break;
case 75:
printf("left arrow\n");
break;
case 77:
printf("right arrow\n");
break;
case 80:
printf("down arrow\n");
break;
default:
break;
}
}
}
int main()
{
while (1) {
Input();
}
return 0;
}
我有一个简单的程序可以检测用户的箭头键按下,但我有两个问题。但首先,这是代码:
#include <iostream>
#include <conio.h>
#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_LEFT 77
#define KEY_RIGHT 75
using namespace std;
int main()
{
while(1)
{
char c = getch();
cout << "Hello";
switch(c) {
case KEY_UP:
cout << endl << "Up" << endl;//key up
break;
case KEY_DOWN:
cout << endl << "Down" << endl; // key down
break;
case KEY_LEFT:
cout << endl << "Right" << endl; // key right
break;
case KEY_RIGHT:
cout << endl << "Left" << endl; // key left
break;
default:
cout << endl << "NULL" << endl; // any other key
break;
}
}
return 0;
}
问题 1:为什么我按任意方向键时,为什么会打印 "Hello" 两次?
问题 2:每当我按任何箭头键或非箭头键时,它都会打印默认的开关盒 "NULL",这应该仅适用于非箭头键。这是为什么?
谢谢
当使用 conio
和 getch
读取键时,为了能够处理特殊键(箭头键、功能键),同时仍将其 return 值放入 char
, getch
returns 特殊键作为两个-char
序列。第一次调用returns 0
,第二次调用returns特殊键的代码。 (否则,您的 KEY_DOWN
- ASCII 80 - 本身就是 'P'。)
将所有这些放在一起的一种方法如下所示:
char c = getch();
if (c == 0) {
switch(getch()) {
// special KEY_ handling here
case KEY_UP:
break;
}
} else {
switch(c) {
// normal character handling
case 'a':
break;
}
}
您可以通过打印 _getch() 的输出来检查自己。对于箭头键,您需要调用它两次,因为箭头键 return 有两个值。第一个值取决于数字锁。
#include <iostream>
#include <conio.h>
void Input() {
if (_kbhit()) {
if(_getch()==224)
switch (_getch())
{
case 72:
printf("up arrow\n");
break;
case 75:
printf("left arrow\n");
break;
case 77:
printf("right arrow\n");
break;
case 80:
printf("down arrow\n");
break;
default:
break;
}
}
}
int main()
{
while (1) {
Input();
}
return 0;
}