使用getline(cin,mystrvar)读取用户输入时,某些控制键不起作用。
示例:
User input: abc^[[Dd
Text: abd
User input: asc
Read bytes: 7
#0: 97
#1: 98
#2: 99
#3: 27
#4: 91
#5: 68
#6: 100
我输入了a,b,c,然后是左箭头和d。 “文本:”显然写入(cout)前三个字符,然后将指针设置为左侧并覆盖c。 “asc”是一个打印长度(mystrvar.size())和ascii值的简单函数。
当调用“stty -ctlecho”(系统(...))时,我可以使用左箭头键,但它不限于我的输入(我可以覆盖“用户输入:”)加上控制代码仍在发送到我的程序。
在Windows上不会发生这种情况 - 我可以正常使用箭头键(甚至是历史记录上/下)。
这里有什么问题?
编辑:我主要使用Fedora 15.在lxterminal,terminal,xterm,konsole,gnome-terminal(作为终端)或bash,ksh之间似乎没有任何区别tcsh(作为shell)。
答案 0 :(得分:2)
这些键如何工作是终端的属性,而不是c ++程序的属性。程序获取缓冲的输入行,您的终端负责组装该行。
答案 1 :(得分:1)
虽然它不应该与程序(收到标准输入)有任何关系,但我找到了一种解决方法,这需要程序的行为略有不同:
#include <readline/readline.h>
#include <readline/history.h>
string blah()
{
string str;
cout << "User input (readline): ";
char *inp_c = readline(""); //Instead of getline()
str = (const char *)(inp_c); //Because C strings stink
//...
return str;
}
这很有效。 我无法在Windows上编译它。 错误:readline / readline.h:没有这样的文件或目录 显然这不是标准的标题,所以我必须先安装/安装它。
如果有人知道更好的方法,请告诉我!
答案 2 :(得分:0)
PlasmaHH是对的,这些键的处理方式取决于终端。但不仅如此:shell解释器也发挥了作用。
这是一个简单的建议:使用“bash”,默认情况下正确处理这些键(最后在我的机器上; - )
启动“bash”并重试。
答案 3 :(得分:0)
好的,另一次尝试。
您认为谁为您提供内联编辑功能? (按回车键之前返回,删除等的能力)当然不是你的程序。所以它必须是另一个程序。哪一个 ?因为它不是shell,所以会说你正在使用的控制台。看起来像windows cmd提示符提供此功能。 Linux控制台也应该提供它,但它可能已被停用或需要一个数据包。
您说您没有使用远程连接。但是你使用的是什么控制台?尝试“konsole”(kde控制台)或您的系统可能具有的其他变体。
如果没有程序来解释这些特殊键,它们只会被附加到输入缓冲区......