You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kali Linux下使用Ncurses的C++程序无法识别方向键,终端显示转义码

Kali Linux下使用Ncurses的C++程序无法识别方向键,终端显示转义码

兄弟,我看了你的代码,问题主要出在几个关键的ncurses初始化步骤缺失,还有一些和ncurses工作机制冲突的写法,我给你梳理下问题点和修复方案:

  • 最核心的问题:没初始化ncurses环境
    ncurses程序必须先调用initscr()来初始化屏幕和标准窗口stdscr,你代码里直接调用keypad(stdscr, TRUE),但此时stdscr还没被创建,导致开启方向键支持的设置根本没生效,所以方向键的转义序列直接被当成普通字符显示在终端上了。

  • 不要混用标准IO和ncurses输出
    你用了printf("derecha"),但ncurses有自己的输出管理机制,标准printf的输出会绕过ncurses的窗口缓冲区,导致显示混乱,应该用ncurses提供的printw()或者mvprintw()来输出内容。

  • 循环结构不合理
    escucharEntrada里的while(true)是死循环,一旦进入这个函数就会一直卡在输入处理,永远回不到主循环的imprimirPantalla,可以改成单次按键处理,或者在输入函数里增加退出条件(比如按q键退出程序)。

  • 缺少终端恢复步骤
    程序结束时要调用endwin()来恢复终端的正常状态,不然退出后你的终端可能会出现输入不显示等异常情况;另外你用new创建了Player对象,记得最后delete避免内存泄漏。

下面是修复后的完整代码:

#include <stdio.h>
#include <ncurses.h>
#include <cstdlib> // 用于exit()

typedef struct rep_player{
    char simbolo;
    int posX;
    int posY;
} * Player;

void escucharEntrada(Player jugador){
    int ch = wgetch(stdscr);
    if(ch == KEY_RIGHT){
        printw("derecha"); // 替换printf为printw
        refresh(); // 刷新屏幕显示内容
    } else if(ch == 'q'){ // 增加退出条件
        endwin();
        delete jugador;
        exit(0);
    }
}

void imprimirPantalla(Player jugador){
    // 这里可以添加你的屏幕绘制逻辑,比如清屏、绘制玩家位置等
    clear();
    mvprintw(jugador->posY, jugador->posX, "%c", jugador->simbolo);
    refresh();
}

int main(){
    // 第一步:初始化ncurses
    initscr();
    // 开启方向键支持
    keypad(stdscr, TRUE);
    // 关闭输入回显
    noecho();
    // 禁止光标显示(可选,提升体验)
    curs_set(0);

    const int PANTALLA_LARGO = 6;
    const int PANTALLA_ANCHO = 6;
    const char PANTALLA_FONDO = 'X';
    Player jugador = new rep_player;
    jugador->simbolo = 'O';
    jugador->posX = 0;
    jugador->posY = 0;

    while(true){
        imprimirPantalla(jugador);
        escucharEntrada(jugador);
    }

    // 理论上到不了这里,但还是加上保险
    endwin();
    delete jugador;
    return 0;
};

你编译的时候记得链接ncurses库,用这个命令:
g++ your_program.cpp -o your_program -lncurses

运行程序后按右键就能看到"derecha"显示,按q键可以正常退出,终端也不会出现异常啦。

备注:内容来源于stack exchange,提问作者Nico Perez

火山引擎 最新活动