为什么我使用ncurses替代字符集不能正常工作?

问题描述

我试图编写一个生成填字游戏网格的程序,所以我使用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函数,该函数只用于sizeXsizeY的主体;我什么也没碰,它突然停止工作了。我尝试撤消在它无法正常运行后仍然无法正常运行的操作。

因此,无论是否意识到,您还更改了其他内容。终端设置可能搞砸了—有趣的事情已经众所周知。您是否尝试过创建新的终端窗口并在新窗口中再次尝试?

哦,是的!那是码头! “重置”后,它起作用了,谢谢!我不知道为什么我没有早些考虑。

在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 访问,则必须按照以下步骤操作。

Enable VT100 line drawing even in UTF-8 mode

Verif 控制台配置为 UTF

dpkg-reconfigure console-setup