在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
个周期重新打印字符串吗?这会很麻烦。
那么,我怎样才能正确显示给用户发生了什么?
答案 0 :(得分:1)
如果OP的程序使用keypad()
函数,则左光标(箭头)和擦除键将具有相同的效果。 getnstr
不支持内联编辑(在行内移动光标)。 (顺便说一下,curses的其他实现对光标键没有任何作用)。
作为支持内联编辑的程序示例,dialog
很有用(它适用于UTF-8)。另一方面,因为它将响应存储为普通字符串,所以比使用wget_wch
明确编写的内容更复杂。
cdk无法处理UTF-8。
ncurses没有提供更有趣的功能,因为:
最近在 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