【问题标题】:Deleting a character already printed in the terminal in ncurses在 ncurses 中删除终端中已打印的字符
【发布时间】:2017-12-02 03:01:28
【问题描述】:

我正在用 ncurses 编写一个文本编辑器。程序以原始模式初始化。所以我需要手动做很多事情,比如删除,避免打印不可打印的字符等。

删除:

void console(ch)
{
    if(ch == 8) //8 = backspace according to asciitables.com
    {
        printw("\b");
        printw(" ");
    }
    else
    {
        addch(ch);
    }
}

为了避免不可打印的字符:

    void console(ch)
    {
       bool safe = TRUE;
       int avoid[] = { 1,2,3,4,5,6,7,8};
       for(int i=0;i<4;i++)
    {
        while(ch==avoid[i])
        {
            safe = false;
        }
    }
    if(safe)
    {
        printw("%c",ch); //Prints the key's characters on the screen.
    }
    else 
    {
        break;
    }
 }

在删除中,我想在终端中删除之前打印的字符并插入一个空格并将光标移回前一个字符的位置。但这不起作用。

在避免不可打印字符中,我想避免打印不可打印字符而只打印可打印字符。但这似乎也不起作用。

如果有人指出我错在哪里并纠正我,那将非常有帮助。如果有人能告诉我 ncurses 库中是否有任何特定功能,那也会很有帮助。我对 ncurses 非常陌生。

【问题讨论】:

  • 您正在打印到终端,而不是“标准输出”。不要将 stdout 与终端混为一谈,尤其是在您编写基于 curses 的程序时。
  • 好的。改变了那个。但是告诉我我哪里错了??
  • 到底是怎么回事?如果printw("\b") 完全有效,您会希望printw("\b \b"); 用空格覆盖并将光标留后退。
  • 感谢工作。但是如何避免不可打印的字符呢??
  • 您是否尝试过检查每个字符:isprint(ch)

标签: c linux ncurses curses


【解决方案1】:

curses 中检测“不可打印”字符的最简单方法是检查来自unctrl 的结果。如果字符可打印,则结果为单个字符。否则为两个或多个字符:

char *check = unctrl(ch);
int safe = (check != 0 && strlen(check) == 1);

manual page 进行了一些详细说明)。

顺便说一下,addchprintw 更适合打印字符(但请记住,它的参数是 chtype,它适合 @987654329 @,而不是 char)。同样,手册页对于准备程序很有用。

【讨论】:

  • 谢谢先生。这真的帮助了我。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 2012-04-14
相关资源
最近更新 更多