为什么两种情况下的输出都不同?

时间:2014-01-14 12:33:55

标签: c input output

这是第一个代码

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

2 个答案:

答案 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);