我有一个简单的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,那么我还应该做什么才能删除字符?
答案 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);
}
希望这对任何人都有帮助,我认为它确实简化了原本很复杂的程序。