使用ncurses的winch()获取U+2588字符失败问题求助
解决ncurses中winch()判断ACS_BLOCK失效的问题
核心问题分析
winch()返回的chtype类型是字符编码+显示属性的组合值,直接拿它和ACS_BLOCK比较肯定不对——必须先用A_CHARTEXT掩码剥离属性位,只保留纯字符部分再做判断。另外你原代码还有个致命遗漏:内层循环里没移动光标,导致每次都读取同一个位置的字符,根本没遍历目标区域。
修复步骤
正确提取字符部分
把判断条件改成:chtype current_ch = winch(program->board->win); if ((current_ch & A_CHARTEXT) != ACS_BLOCK)补上光标移动逻辑
内层循环每处理完一个字符,必须把光标右移一位,否则永远只读取第一个字符:wmove(program->board->win, getcury(program->board->win), getcurx(program->board->win) + 1);适配宽字符环境(如果需要)
如果你的终端用UTF-8编码,要确保:- 编译时链接
ncursesw库(代替ncurses),比如编译命令:gcc your_code.c -o app -lncursesw - 程序初始化时调用
setlocale(LC_ALL, "")开启 locale 支持
- 编译时链接
修复后的完整代码
#include <locale.h> #include <ncurses.h> // 假设SELECTION是你定义的高亮属性,比如反色 #define SELECTION A_REVERSE void highlight_tile(const Program *program, const int row, const int col) { wmove(program->board->win, TILE_HEIGHT * row + 1, TILE_WIDTH * col + 1); for (int i = 0; i < TILE_HEIGHT; i++) { for (int j = 0; j < TILE_WIDTH; j++) { chtype current_ch = winch(program->board->win); // 剥离属性后判断是否为ACS_BLOCK if ((current_ch & A_CHARTEXT) != ACS_BLOCK) { wattron(program->board->win, SELECTION); if ((row + col) % 2 == 0) { wprintw(program->board->win, "#"); } else { wprintw(program->board->win, "~"); } wattroff(program->board->win, SELECTION); } // 移动光标到下一个字符位置 wmove(program->board->win, getcury(program->board->win), getcurx(program->board->win) + 1); } // 换行后回到行首对应位置 wmove(program->board->win, getcury(program->board->win) + 1, getcurx(program->board->win) - TILE_WIDTH); } }
内容的提问来源于stack exchange,提问作者detectivekaktus
相关产品推荐
相关产品推荐

