【问题标题】:getchar() returns the same value (27) for up and down arrow keysgetchar() 为向上和向下箭头键返回相同的值 (27)
【发布时间】:2013-02-24 17:36:09
【问题描述】:

所以对于键盘上的向上键,我得到 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 我该如何解决这个问题?
  • 我相信你可以在curses中使用wgetch()来处理这个

标签: c keyboard getchar


【解决方案1】:

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

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

【讨论】:

  • 那么我的方法应该是什么?当用户在控制台中按下时,我的 C 程序需要表现得不同
  • @RichardMckenna:使用图书馆。诅咒,或 Readline,取决于你的程序做什么。
【解决方案2】:

这是使用 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

这里是tutorial,可帮助您开始使用 ncurses。

【讨论】:

  • 为什么不能在 Netbeans 中编译?
  • @RichardMckenna,这个 C 程序是为 linux 上的 gcc 编译器(及其工作)编写的。对 netbeans 进行适当的更改并使其正常工作
  • 你必须将它与 ncurses 链接,同时编译它,“gcc main.c -lncurses”,但首先你必须确保你已经安装了 ncurses 库
  • 是否有另一种确定向上键和向下键的方法。不可能这么复杂
  • 由于方向键没有 ascii 值,只能使用 c,因此无法确定这些键,使用 ncurses 等支持库可能是唯一的选择
【解决方案3】:

http://www.gnu.org/software/ncurses/ 上查看 ncurses 库。将其链接到您的程序将使您能够对关键事件进行各种巧妙的处理。阅读文档,看看你是否想使用它。它提供的正是您所说的功能。

编码愉快!

【讨论】:

    【解决方案4】:

    您将按下的键与按下时生成的字符混淆了。当按下 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);
    }
    

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

    【讨论】:

    • 那么我的方法应该是什么?当用户在控制台中按下时,我的 C 程序需要表现得不同
    • 你运行我的程序了吗?你确实得到了不同的值,所以你可以表现不同。你的错误只是认为键和字符之间会有一一对应的关系。如果您想在某人输入 a 时使用 shift 或不使用 shift 时做出不同的反应,您可以这样做,因为您确实得到了不同的字符,即使没有“shift 键”字符。
    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多