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

myzjeezk  于 2023-06-07  发布在  其他
关注(0)|答案(5)|浏览(279)

当使用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)之间似乎没有任何区别。

k4ymrczo

k4ymrczo1#

这些键的工作方式是终端的属性,而不是c++程序的属性。程序将输入行缓存起来,终端负责组装这一行。

omvjsjqw

omvjsjqw2#

虽然它不应该与程序(接收stdin)有任何关系,但我找到了一个解决方案,它需要程序的行为略有不同:

#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:没有这样的文件或目录显然这不是一个标准的头,所以我必须得到/安装它第一。
如果有人知道更好的方法,请让我知道!

kmynzznz

kmynzznz3#

PlasmaHH是对的,如何处理这些密钥取决于终端。但不仅如此:shell解释器也发挥了它的作用。
一个简单的建议:使用“bash”,它默认情况下正确处理这些键(最后在我的机器上;- )
只需启动“bash”并重试。

irtuqstp

irtuqstp4#

好吧,那就再试一次。
你认为是谁给你提供了内联编辑功能?(返回、删除等功能)在按Enter键之前)
当然,不是你的程序。所以必须是另一个程序。哪一个因为它不是shell,所以会说您正在使用的控制台。看起来windows cmd prompt提供了这个功能。Linux控制台也应该提供它,但它可能已被停用或需要一个数据包。
您说您没有使用远程连接。但是你用的是什么控制台?尝试“konsole”(kde控制台)或您的系统可能具有的其他变体。
如果没有程序来解释这些特殊的键,它们只是被附加到输入缓冲区中。

o4tp2gmn

o4tp2gmn5#

在Pop!上尝试rlfe OS / Ubuntu。对我很有效
我的解决方案:https://stackoverflow.com/a/76418140/19585456

相关问题