Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 控制键(左箭头)被发送到stdin(^[[D]),而不是被解释_C++_Controls_Key_Stdin_Getline - Fatal编程技术网

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

C++ 控制键(左箭头)被发送到stdin(^[[D]),而不是被解释,c++,controls,key,stdin,getline,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。 “Text:”显然写(cout)前三个字符,然后将指针设置为左侧并覆盖c。 “asc”是一个简单的函数,用于打印长度(mystrvar.size

当使用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”(系统(…)时,我可以使用左箭头键,但它不仅限于我的输入(我可以覆盖“用户输入:”),而且控制代码仍被发送到我的程序

这在Windows上不会发生-我可以正常使用箭头键(历史记录中甚至可以使用向上/向下键)

这里怎么了


编辑:我主要使用Fedora 15。lxterminal、terminal、xterm、konsole、gnome terminal(作为终端)或bash、ksh、tcsh(作为外壳)之间似乎没有任何区别这些键是如何工作的,是你的终端的一个属性,而不是C++程序。程序得到输入行缓冲,而你的终端负责组装这条线。

PrimaMH是正确的,这些键是如何处理的取决于终端。但不仅如此:shell解释器也起作用。

因此,一个简单的建议是:使用“bash”,默认情况下可以正确处理这些键(最后在我的机器上;-)

只需启动“bash”并重试。

好的,然后再试一次

您认为是谁为您提供了内联编辑功能?(在按enter键之前返回、删除等功能)

当然不是你的程序。所以它必须是另一个程序。哪一个?因为它不是外壳,会说是你正在使用的控制台。看起来windows cmd提示符提供了此功能。Linux控制台也应该提供此功能,但它可能已被停用或需要一个数据包

您说您没有使用远程连接。但是您使用的是什么控制台?请尝试“konsole”(kde控制台)或您的系统可能具有的其他变体


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

虽然它与程序(接收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;
}
#包括
#包括
字符串blah()
{
字符串str;

所以我必须以某种方式配置终端吗?我该怎么做?@basic6
rlwrap
是一个简单的工具,可以启用
readline
功能。也许它适用于您的平台。@basic6:因为我甚至不知道您在使用什么终端,我一点也不知道。无论如何,这将是一个额外的问题。可能不是这样,可能只是在阅读了终端的精美手册之后。@Luc Danton是的,它与rlwrap一起工作。但这不是一个真正的解决方案。我正在为朋友编写一个程序-我必须告诉他们吗“它在Windows上工作,但如果使用Linux版本,则必须先安装并启动其他程序,因为Linux终端无法正确处理箭头键”…?在我看来,这似乎是一个错误(/misbehavior)在terminal/shell中。@basic6:我真的不知道,因为我似乎不使用以这种方式请求用户输入的程序,他们都使用命令行参数。但如果是这样,我也不会感到惊讶,毕竟libreadline的存在是有原因的。我已经尝试过了(和ksh)-似乎没有任何区别(我主要使用Fedora,如果它能起作用的话)。这也取决于你是如何启动程序的,当使用exec时,它会在shell进程上跺脚……很可能他正在使用putty连接到某个linux系统,而所有的信号都被弄乱了。我没有使用putty(或任何其他远程连接).是的,我知道了。我不知道的是如何告诉终端解释这些控制键,而不是将它们发送到我的程序。我不知道的是它们为什么会被发送到程序。我可以使用BACKSPACE,但我不能返回并使用DELETE,所以内联编辑只起部分作用。这对我来说没有意义-或者将所有内容发送到程序或解释控制键。后者应该是默认值。如果我错了,请纠正我。哦,我也试过konsole-同样的东西。好吧,现在你试过了,我没有建议…我开始提问,如果有人找到答案,我感兴趣。。。