问题描述
我试图编写一个生成填字游戏网格的程序,所以我使用ncurses库,因为我只需要一个简单的界面来显示网格,问题是当我将Box()函数与ACS_VLINE和ACS_HLINE,它不起作用;它写“ q”和“ x”而不是方框行。它在一开始就起作用,但突然停止了作用。我不知道为什么 我只是用initscr()和noecho()初始化ncurses。 这是我绘制框的代码部分:
int crossword(char ***grid,WINDOW **win,WINDOW ****c,int x,int y)
{
int i;
int j;
int ch;
t_word_list *wrdlist;
clear();
(void)x;
(void)y;
if (!(wrdlist = get_words("data/words.list")))
return (-1);
Box(*win,ACS_VLINE,ACS_HLINE);
i = -1;
while ((*c)[++i])
{
j = -1;
while ((*c)[i][++j])
mvwaddch((*c)[i][j],(*grid)[i][j]);
}
wrefresh(stdscr);
while ((ch = getch()))
if (ch == 27)
{
nodelay(stdscr,TRUE);
ch = getch();
nodelay(stdscr,FALSE);
if (ch < 0)
break ;
}
return (endwin());
}
输出:
lqqqqqqqqqqqqqqqqqqqqqk
x 0 0 0 0 0 0 0 0 0 0 x
x 0 0 0 0 0 0 0 0 0 0 x
x 0 0 0 0 0 0 0 0 0 0 x
x 0 0 0 0 0 0 0 0 0 0 x
x 0 0 0 0 0 0 0 0 0 0 x
x 0 0 0 0 0 0 0 0 0 0 x
x 0 0 0 0 0 0 0 0 0 0 x
x 0 0 0 0 0 0 0 0 0 0 x
x 0 0 0 0 0 0 0 0 0 0 x
x 0 0 0 0 0 0 0 0 0 0 x
mqqqqqqqqqqqqqqqqqqqqqj
编辑:我用最少的代码重新创建了这个问题:
#include <curses.h>
int main(void)
{
WINDOW *win;
initscr();
win = subwin(stdscr,10,1,1);
Box(win,ACS_HLINE);
wrefresh(stdscr);
getch();
return (0);
}
输出:
lqqqqqqqqk
x x
x x
x x
x x
x x
x x
x x
x x
mqqqqqqqqj
我用于编译的标志:gcc main.c -lcurses
解决方法
将部分注释转换为答案。
它在何时工作和何时停止工作之间发生了什么变化? …是否可以重新创建在新的MCVE(Minimal,Complete,Verifiable Example中创建工作版本时要使用的步骤 —或MRE或SO现在使用的任何名称) 或 SSCCE(Short,Self-Contained,Correct Example)。 这将使您找出用最少的代码就能破坏工作代码的原因吗?
…我刚刚编辑了
atoi
函数,该函数只用于sizeX
和sizeY
的主体;我什么也没碰,它突然停止工作了。我尝试撤消在它无法正常运行后仍然无法正常运行的操作。
因此,无论是否意识到,您还更改了其他内容。终端设置可能搞砸了—有趣的事情已经众所周知。您是否尝试过创建新的终端窗口并在新窗口中再次尝试?
哦,是的!那是码头! “重置”后,它起作用了,谢谢!我不知道为什么我没有早些考虑。
在curses(ncurses)程序被证明是可靠的之前,请始终考虑被测程序的有缺陷版本破坏终端设置的可能性。当终端正常工作时(第一次创建时,在运行程序之前),请使用stty -g
生成字符串。然后,您可以使用该字符串将终端重置为相同的已知状态(假设是问题所在的stty
设置)。有时,即使如此,还是需要一个新的终端窗口。
good_stty=$(stty -g)
…testing program under development…
stty "$good_stty"
有时,您可能需要键入 control-J ,然后输入stty "$good_stty"
(或stty sane
)和另一个 control-J ,因为该行结束设置已被修改,无法正确恢复。
问题可能是您的控制台的控制台编码。此外,如果您从 putty 访问,则必须按照以下步骤操作。
Verif 控制台配置为 UTF
dpkg-reconfigure console-setup