使用带有ncurses的退格键

时间:2012-07-08 23:31:24

标签: c ncurses

我有一个简单的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语句检查delete / backspace,那么我还应该做什么才能删除字符?

2 个答案:

答案 0 :(得分:5)

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

你可以两次调用delch(),但是你必须找出哪些字符作为双字符(或更多)序列回显。

您最好的选择可能是致电noecho()并自行打印字符。

答案 1 :(得分:1)

实际上有一种更简单的方法,请查看以下代码:

while((ch = getch() != KEY_F(1))
    {
        switch(ch)
        {
            case 127: { // Delete key
                form_driver(Form, REQ_DEL_PREV);
                break;
            }
            case 10: {// Enter key
                // Do something

            }
            default: {
                // If this is a normal character
            }
        }
    }

(在此示例中,我要求表单驱动程序删除“表单”表单中的最后一个键入的字符,这将完全模拟删除键的常规功能。)

注意:在我的机器(Mac OS)上,此方法有效。代表每个键的数字可能在您的计算机上有所不同。不过,您可以编写这样的程序来找出需要使用的键码:

printw("Press Delete and its corresponding keycode will be printed!");
while((ch = getch() != KEY_F(1))
    {

        printw(ch);

    }

希望这对任何人都有帮助,我认为它确实简化了原本很复杂的程序。