getchar()函数对于上箭头键和下箭头键返回相同的值(27)。

9

对于键盘上的向上箭头键,我得到的是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");
    }

} 

@MitchWheat 我该如何解决这个问题? - NoNameY0
我相信你可以在curses中使用wgetch()来处理这个。 - Memento Mori
5个回答

15

27表示你正在获取箭头的ANSI转义序列。它们将是三个字符的序列:27、91,然后是65、66、67、68(如果我没记错)代表上、下、右、左。如果从getchar()调用中获得一个27,则再次调用两次,以获取91和决定按下哪个箭头键的数字。

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


那么我的方法应该是什么?当用户在控制台按上键时,我的C程序需要表现出不同的行为,而当他按下键时则需要表现出另一种不同的行为。 - NoNameY0
3
使用一个库。根据你的程序需要选择 Curses 或 Readline。 - Dietrich Epp
有些环境下你不能使用这样的库,但我找到了一种非常便携的方法。使用 read(fileno(stdin), &rval, 1); 似乎在任何地方都可以工作。 - Charles Lohr

4

这是一个使用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库。

gcc main.c -lncurses

这里有一个教程可帮助您入门ncurses:

教程链接


为什么在Netbeans中无法编译? - NoNameY0
@RichardMckenna,这个 C 语言程序是为在 Linux 上的 gcc 编译器编写的(并且它能正常工作)。请对它进行适当的修改以适应 NetBeans,并让它正常工作。 - Barath Ravikumar
有没有其他方法来确定向上键和向下键?这不可能这么复杂。 - NoNameY0
由于箭头键没有 ASCII 值,因此仅使用 C 无法确定这些键,使用支持库(如 ncurses)可能是唯一的选择。 - Barath Ravikumar
@RichardMckenna 嗨,伙计,我不知道什么时候会有空闲时间和任何人聊天,但如果你有技术疑问,请发帖,我一定会查看你的问题并回答它们。 - Barath Ravikumar
显示剩余2条评论

1

请查看http://www.gnu.org/software/ncurses/中的ncurses库。将其链接到您的程序中,将使您能够使用按键事件进行各种有趣的操作。阅读文档,看看是否想要使用它。它提供了您所说寻找的完全功能。

编码愉快!


0
这个答案仅供以后参考;使用getch()而不是getchar()
我遇到了同样的问题(按箭头键时出现转义序列),做了这个改变事情得到了解决。
如果你正在使用curses.h,在读取之前必须添加以下行:
keypad(stdscr, TRUE);

0

你把按键和按下时它们生成的字符混淆了。当按下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);
}

尝试按上箭头,然后按回车键。然后尝试按下箭头,然后按回车键。您会发现将键转换为字符并不简单。


1
那么我的方法应该是什么?当用户在控制台按上键时,我的C程序需要表现出不同的行为,而当他按下键时则需要表现出另一种不同的行为。 - NoNameY0
2
你运行了我的程序吗?你会得到不同的值,因此你可以表现出不同的行为。你的错误就是认为键和字符之间会有一一对应关系。如果你想要在人们输入带有 Shift 的 a 或不带 Shift 的 a 时有不同的反应,你可以这样做,因为你确实会得到不同的字符,尽管没有 "Shift 键" 字符。 - David Schwartz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接