【问题标题】:Using backspace with ncurses在 ncurses 中使用退格键
【发布时间】:2012-07-08 23:31:24
【问题描述】:

我设置了一个简单的 ncurses 程序,它使用 getch() 一次读取一个字符并将它们复制到缓冲区中。我遇到的问题是检测到按下退格键。以下是相关代码:

while((buffer[i] = c = getch()) != EOF) {
    ++i;
    if (c == '\n') {
        break;
    }
    else if (c == KEY_BACKSPACE || c == KEY_DC || c == 127) {
        i--;
        delch();
        buffer[i] = 0;
    }
    refresh();
}

但是当尝试运行此代码时,这是尝试从“这是一个测试”行中删除字符后出现在屏幕上的内容:

this is a test^?^?^?

而buffer的内容是:

this is a test

使用 gdb 我知道正在调用检查删除/退格的 if 语句,那么我还应该做什么才能删除字符?

【问题讨论】:

  • this is a test^?^?^?是buffer的内容,还是屏幕上出现的内容?无论哪种方式,另一个是什么?
  • this is a test^?^?^? 是终端上显示的内容,缓冲区包含this is a test。

标签: c ncurses


【解决方案1】:

看起来^? 是您输入 DEL 字符时在屏幕上回显的内容。

您可能会调用delch() 两次,但随后您必须弄清楚哪些字符作为两个字符(或更多)序列回显。

您最好的选择可能是调用noecho() 并自己显式打印字符。

【讨论】:

  • 效果很好,它实际上也让我的代码更干净了。此外,我必须将 i 减 2,因为我在检查退格之前将其递增。谢谢! :)
【解决方案2】:

实际上有一种更简单的方法,即使用表单库和 ncurses。如果您将代码更改为:

while((buffer[i] = c = getch()) != EOF) {
    ++i;
    if (c == '\n') {
        break;
    }
    else if (c == KEY_BACKSPACE || c == KEY_DC || c == 127) {
        form_driver(Form, REQ_DEL_PREV);
    }
    refresh();
}

它会毫无问题地退格。您可以找到 REQ_DEL_PREV 命令here 的一些(尽管有限)文档。

【讨论】:

  • 这是什么?你已经从这段代码中省略了每一个真实的逻辑。如果你用它来回答问题,你不能只省略大部分代码......
猜你喜欢
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多