当使用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。“Text:“显然写了(cout)前三个字符,然后将指针设置到左边并覆盖c。“asc”是一个简单的函数,它打印长度(mystrvar.size())和ASCII值。
当调用“stty -ctlecho”(system(...))时,我可以使用左箭头键,但它不限于我的输入(我可以覆盖“User input:”)加上控制代码还在发送到我的程序中。
这在Windows上不会发生-我可以正常使用箭头键(甚至向上/向下用于历史记录)。
怎么了?
编辑:我主要使用Fedora 15。lxterminal、terminal、xterm、konsole、gnome-terminal(作为终端)或bash、ksh、tcsh(作为shell)之间似乎没有任何区别。
5条答案
按热度按时间k4ymrczo1#
这些键的工作方式是终端的属性,而不是c++程序的属性。程序将输入行缓存起来,终端负责组装这一行。
omvjsjqw2#
虽然它不应该与程序(接收stdin)有任何关系,但我找到了一个解决方案,它需要程序的行为略有不同:
这工作。我不能编译它在Windows虽然。错误:readline/readline.h:没有这样的文件或目录显然这不是一个标准的头,所以我必须得到/安装它第一。
如果有人知道更好的方法,请让我知道!
kmynzznz3#
PlasmaHH是对的,如何处理这些密钥取决于终端。但不仅如此:shell解释器也发挥了它的作用。
一个简单的建议:使用“bash”,它默认情况下正确处理这些键(最后在我的机器上;- )
只需启动“bash”并重试。
irtuqstp4#
好吧,那就再试一次。
你认为是谁给你提供了内联编辑功能?(返回、删除等功能)在按Enter键之前)
当然,不是你的程序。所以必须是另一个程序。哪一个因为它不是shell,所以会说您正在使用的控制台。看起来windows cmd prompt提供了这个功能。Linux控制台也应该提供它,但它可能已被停用或需要一个数据包。
您说您没有使用远程连接。但是你用的是什么控制台?尝试“konsole”(kde控制台)或您的系统可能具有的其他变体。
如果没有程序来解释这些特殊的键,它们只是被附加到输入缓冲区中。
o4tp2gmn5#
在Pop!上尝试
rlfe
OS / Ubuntu。对我很有效我的解决方案:https://stackoverflow.com/a/76418140/19585456