控制键(向左箭头)被发送到stdin(^ [[D]而不是被解释

时间:2011-09-09 12:00:54

标签: c++ controls key stdin getline

使用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)。

4 个答案:

答案 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控制台)或您的系统可能具有的其他变体。

如果没有程序来解释这些特殊键,它们只会被附加到输入缓冲区......