避免来自 C 或 C++ 标准输入流的控制序列(如 ^[[C)
Avoid control sequences(like ^[[C) from C or C++ standard inputstream
代码:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
cout << "Enter a string : " << endl;
cin >> s;
cout << "The Entered String is : " << s << endl;
cout << "The Length of Entered String is : " << s.length() << endl;
return 0;
}
输出:
┌─[jaysmito@parrot]─[~/Desktop]
└──╼ $g++ -o trycpp -Os try.cpp
┌─[jaysmito@parrot]─[~/Desktop]
└──╼ $./trycpp
Enter a string :
hello
The Entered String is : hello
The Length of Entered String is : 5
┌─[jaysmito@parrot]─[~/Desktop]
└──╼ $./trycpp
Enter a string :
hello^[[C
The Entered String is : hello
The Length of Entered String is : 8
同样的事情也发生在 C 中,如果你想要 C 中的代码,请索取!
当我按下箭头键时 ^[[C 出现而不是光标移动(类似的事情发生在其他箭头键、转义键、home、end 上)!
这里发生的是字符串第二次包含字符 :
['h', 'e', 'l', 'l', 'o', '\x1b', '[', 'C']
所以,'\x1b', '[', 'C' 是从键盘发送到 shell 的字符序列,代表右箭头键(光标向前)。
我想要的是,这些字符不会出现在 shell 中,但光标会移动(根据按下的键向前、向后、返回原点、结束等)。
接受输入后的处理意义不大,主要目的是让光标移动!
我如何在 C 或 C++ 中实现这一点?
[编辑]
唯一的目标是在使用该程序时为用户提供类似终端的体验。
光标移动、功能键和其他特殊键在不同终端的处理方式不同。但在大多数情况下会生成一些escape sequence。
大多数语言中的程序提示都是从 stdin
中简单读取的,它将按原样读取转义序列。所以例如←[D
、←[C
对应left/right光标移动。
如果您想像 bash
提示那样处理这些转义序列,那么您需要自己做或使用第 3 方库。
一个流行的是 GNU readline
,但也有其他选择,例如libedit
.
这是一个带有libedit的演示程序(需要先安装libedit:sudo apt install libedit-dev
):
#include <editline/readline.h>
#include <stdio.h>
int main() {
char *line;
while (line = readline("Enter input: ")) {
printf("Entered: %s\n", line);
}
return 0;
}
编译并运行:
$ g++ test.cpp -o test -ledit
$ ./test
现在您应该可以使用 left/right 键在输入行中移动。
代码:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
cout << "Enter a string : " << endl;
cin >> s;
cout << "The Entered String is : " << s << endl;
cout << "The Length of Entered String is : " << s.length() << endl;
return 0;
}
输出:
┌─[jaysmito@parrot]─[~/Desktop]
└──╼ $g++ -o trycpp -Os try.cpp
┌─[jaysmito@parrot]─[~/Desktop]
└──╼ $./trycpp
Enter a string :
hello
The Entered String is : hello
The Length of Entered String is : 5
┌─[jaysmito@parrot]─[~/Desktop]
└──╼ $./trycpp
Enter a string :
hello^[[C
The Entered String is : hello
The Length of Entered String is : 8
同样的事情也发生在 C 中,如果你想要 C 中的代码,请索取!
当我按下箭头键时 ^[[C 出现而不是光标移动(类似的事情发生在其他箭头键、转义键、home、end 上)!
这里发生的是字符串第二次包含字符 :
['h', 'e', 'l', 'l', 'o', '\x1b', '[', 'C']
所以,'\x1b', '[', 'C' 是从键盘发送到 shell 的字符序列,代表右箭头键(光标向前)。
我想要的是,这些字符不会出现在 shell 中,但光标会移动(根据按下的键向前、向后、返回原点、结束等)。
接受输入后的处理意义不大,主要目的是让光标移动!
我如何在 C 或 C++ 中实现这一点?
[编辑]
唯一的目标是在使用该程序时为用户提供类似终端的体验。
光标移动、功能键和其他特殊键在不同终端的处理方式不同。但在大多数情况下会生成一些escape sequence。
大多数语言中的程序提示都是从 stdin
中简单读取的,它将按原样读取转义序列。所以例如←[D
、←[C
对应left/right光标移动。
如果您想像 bash
提示那样处理这些转义序列,那么您需要自己做或使用第 3 方库。
一个流行的是 GNU readline
,但也有其他选择,例如libedit
.
这是一个带有libedit的演示程序(需要先安装libedit:sudo apt install libedit-dev
):
#include <editline/readline.h>
#include <stdio.h>
int main() {
char *line;
while (line = readline("Enter input: ")) {
printf("Entered: %s\n", line);
}
return 0;
}
编译并运行:
$ g++ test.cpp -o test -ledit
$ ./test
现在您应该可以使用 left/right 键在输入行中移动。