这是第一个代码
int main()
{
int ch;
while(ch)
{
ch=getch();
printf("%d",ch);
printf("\n");
}
return 0;
}
如果在上面的代码我输入
up arrow key
down arrow key
right arrow key
left arrow key
分别输出如下
224
72
224
80
224
77
224
75
但如果我从代码中删除LOOP,即
int main()
{
int ch;
ch=getch();
printf("%d",ch);
printf("\n");
return 0;
}
并输入
up arrow key
down arrow key
right arrow key
left arrow key
然后分别如下输出
224
224
224
224
从哪里
224
是第一个代码 并在删除LOOP后 以下数字消失的地方
72
80
77
75
答案 0 :(得分:3)
getch()
从控制台获取下一个字符,但是某些键如up arrow key
等会产生两个连续的“字符”。因此,当您删除循环时,您始终只读取第一个字符,而不读取第二个字符。
通常,读取和处理特殊键(如光标键)是非常系统特定的,而不是用C语言定义的 - 你通常会使用一个额外的库(例如Unix上的ncurses)来处理这些。
作为最后的手段,您还可以检查对getch()
的第一次调用是否返回值224
,在这种情况下再次调用它,如下所示:
int key = getch();
if (key == 224) {
key = 0x100 + getch(); // arrow keys will have values > 256
}
...
switch(key) {
case 0x142 : printf("Key up"); break;
...
}
但请注意,这完全不可移植且非常依赖于系统。您至少应该将它封装在一个单独的函数中,并为各种键定义一些常量。
另见
答案 1 :(得分:0)
224表示它是一个功能键,所以你必须得到下一个字节然后你将决定下一个字节是72还是它的向上箭头等等
这是一个例子
int a,b;
while(a=getch())
{
if(a==224)
{
b=getch();
switch(b)
{
case 72:puts("Up arrow");break;
case 80:puts("Down arrow");break;
case 75:puts("Left arrow");break;
case 77:puts("Right arrow");break;
}
}
}
你的第二个代码将输出224并停止,因为那里没有循环,试试这个:
a=getch(),b=getch();
printf("%d %d\n",a,b);