7

我设置了一个简单的 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 语句,那么我还应该做什么才能删除字符?

4

2 回答 2

6

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

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

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

于 2012-07-08T23:42:24.313 回答
1

实际上,通过使用表单库和 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 命令的一些(尽管有限)文档。

于 2018-08-21T17:23:53.553 回答