ncurses和getch - 处理擦除和箭头字符

时间:2015-09-08 13:46:04

标签: c linux input screen ncurses

在Linux和ncurses下的C程序中,我需要从键盘中获取字符(因此,从用户那里获取)并将它们存储到字符串中,只有当用户按下输入。然而,与此同时,我需要为用户显示一个屏幕回显,以便他可以看到他正在写的内容,如果有必要,他可以纠正一些拼写错误。

我的一堆代码正在运行,但它无法处理擦除和箭头字符。

this问题中,当按下 Backspace Del 时,会提供正确存储字符串的解决方案。但是,即使考虑箭头键,也可以选择什么解决方案来显示正确的屏幕回显?

我的代码基本上是:

while(1)
{
if (getch() =! ERR)
// store the character into an array
if (getch() == 10)
// terminate the string and print it on screen
}

通过getch()逐个获取角色。与链接问题一样,如果我不使用noecho()并按 Backspace ,则会显示序列^?,而不是从屏幕中删除前一个字符。如果我使用noecho(),程序应该向用户显示实时发生的情况。我应该在每while个周期重新打印字符串吗?这会很麻烦。

那么,我怎样才能正确显示给用户发生了什么?

3 个答案:

答案 0 :(得分:1)

如果OP的程序使用keypad()函数,则左光标(箭头)和擦除键将具有相同的效果。 getnstr不支持内联编辑(在行内移动光标)。 (顺便说一下,curses的其他实现对光标键没有任何作用)。

作为支持内联编辑的程序示例,dialog很有用(它适用于UTF-8)。另一方面,因为它将响应存储为普通字符串,所以比使用wget_wch明确编写的内容更复杂。

cdk无法处理UTF-8。

ncurses没有提供更有趣的功能,因为:

  • 该功能已在form
  • 它不符合extension的条件,因为人们可以在不知道图书馆内部的情况下轻松开发此类各种功能。

最近在 ncurses, print and contemporary acquire strings 中有一个相关问题(用于阻止I / O)(同样,dialog )。

答案 1 :(得分:0)

如果要在用户按 Enter 之前读取字符,您可能希望使用getnstr功能而不是一次读取字符。 getnstr将解释擦除和杀死字符,尽管它远非完整的行编辑系统。

否则,您最终将不得不自己处理所有光标移动字符。这显然更灵活,但也有更多的工作。如果沿着那条路走下去,我建议关闭回声并手动回显(非控制)字符,因为这样可以更好地控制光标位置。

答案 2 :(得分:-1)

这是我的解决方案,它非常简单,不需要noecho();

getyx( stdscr, y, x ); //get current cursor position
x-= 3; //go three position back, one for the char to erase, the other two to erase the backspace char ^? 
mvprintw( y, x, "   " ); //erase chars
move( y, x ); //get in right position for new input