getchar()为上下箭头键返回相同的值(27)

getchar()为上下箭头键返回相同的值(27),c,keyboard,getchar,C,Keyboard,Getchar,所以对于键盘上的向上键,我得到了27,令人惊讶的是,向下键我也得到了27。我需要我的程序在上下键上表现不同,但我似乎无法理解。我正在使用Linux,需要它为Linux工作 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> int main() { int c = getchar(); if(c==27) {

所以对于键盘上的向上键,我得到了27,令人惊讶的是,向下键我也得到了27。我需要我的程序在上下键上表现不同,但我似乎无法理解。我正在使用Linux,需要它为Linux工作

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
    int c = getchar();

    if(c==27)
    {
        printf("UP");
    }

    if(c==28)
    {
        printf("DOWN");
    }

} 
#包括
#包括
#包括
#包括
int main()
{
int c=getchar();
如果(c==27)
{
printf(“UP”);
}
如果(c==28)
{
printf(“向下”);
}
} 

您将按下的键与按下时生成的字符混淆。按下shift键时,您希望得到一个字符吗?尝试以下程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
    do
    {
        int c = getchar();
        printf("c=%d\n", c);
    }
    while (1);
}
#包括
#包括
#包括
#包括
int main()
{
做
{
int c=getchar();
printf(“c=%d\n”,c);
}
而(1),;
}

尝试按向上箭头,然后输入。然后尝试按下向下箭头,然后进入。您将看到键到字符的转换并不简单。

27意味着您将获得箭头的ANSI转义序列。它们将是三个字符序列:27,91,然后是65,66,67,68(IIRC),代表上,下,右,左。如果通过调用
getchar()
获得
27
,则再调用两次以获取
91
和确定按下箭头键的数字

#include<ncurses.h>

int main()
{
int ch;

/* Curses Initialisations */
initscr();
raw();
keypad(stdscr, TRUE);
noecho();

printw("Press E to Exit\n");

while((ch = getch()) != 'E')
{
    switch(ch)
    {
    case KEY_UP:         printw("\nUp Arrow");
                break;
    case KEY_DOWN:      printw("\nDown Arrow");
                break;
    case KEY_LEFT:      printw("\nLeft Arrow");
                break;
    case KEY_RIGHT:     printw("\nRight Arrow");
                break;
    default:    
                printw("\nThe pressed key is %c",ch);

    }
}

printw("\n\Exiting Now\n");
endwin();

return 0;
}

正如其他人所提到的,这是特定于平台的,但您可能不在乎。

请访问ncurses库。将它链接到您的程序将使您能够对关键事件进行各种简洁的处理。仔细阅读文档,看看你是否想使用它。它提供的功能正是您想要的


快乐编码

这是为使用ncurses库而编写的程序,显示按下的箭头键

#include<ncurses.h>

int main()
{
int ch;

/* Curses Initialisations */
initscr();
raw();
keypad(stdscr, TRUE);
noecho();

printw("Press E to Exit\n");

while((ch = getch()) != 'E')
{
    switch(ch)
    {
    case KEY_UP:         printw("\nUp Arrow");
                break;
    case KEY_DOWN:      printw("\nDown Arrow");
                break;
    case KEY_LEFT:      printw("\nLeft Arrow");
                break;
    case KEY_RIGHT:     printw("\nRight Arrow");
                break;
    default:    
                printw("\nThe pressed key is %c",ch);

    }
}

printw("\n\Exiting Now\n");
endwin();

return 0;
}

以下是一个帮助您开始学习ncurses的方法。

那么我应该采取什么方法呢?我的C程序需要在用户向上按时表现出不同的行为,在控制台中按下时表现出不同的行为。你会得到不同的值,所以你的行为会有所不同。你的错误只是认为键和字符之间会有一对一的对应关系。如果你想让一个人在有移位或无移位的情况下输入
a
时做出不同的反应,你可以这样做,因为即使没有“移位键”字符,你也会得到不同的字符。@MitchWheat如何解决这个问题?我相信你可以在诅咒中使用wgetch()来处理这个问题,那么我的方法应该是什么呢?我的C程序需要在用户按下按钮时表现出不同的行为,在用户按下按钮时表现出不同的行为console@RichardMckenna:使用图书馆。诅咒,或Readline,这取决于你的程序做什么。为什么它不在Netbeans中编译?@RichardMckenna,这个C程序是为linux上的gcc编译器编写的(及其工作)。对netbeans进行适当的更改并使其正常工作您必须在编译时将其与ncurses链接,“gcc main.c-lncurses”,但首先您必须确保已安装ncurses库这是确定向上键和向下键的另一种方法。这不会这么复杂,因为箭头键没有ascii值,只使用c,所以不可能有这样的方法来确定这些键,使用支持库(如ncurses)可能是唯一的选择