避免来自 C 或 C++ 标准输入流的控制序列(如 ^[[C)

Posted

技术标签:

【中文标题】避免来自 C 或 C++ 标准输入流的控制序列(如 ^[[C)【英文标题】:Avoid control sequences(like ^[[C) from C or C++ standard inputstream 【发布时间】:2021-03-31 11:09:09 【问题描述】:

代码:

#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' 是从键盘发送到外壳的字符序列,用于表示右箭头键(向前光标)。

我想要的是这些字符不会显示在外壳中,但光标会移动(根据按下的键向前、向后、到家、结束等)。

输入后处理意义不大,主要目的是让光标移动!

如何在 C 或 C++ 中实现这一点?

[编辑]

唯一的目标是在使用程序时为用户提供与终端一样的体验。

【问题讨论】:

您需要控制终端,例如使用ncurses 或类似的库。使用 C++ 标准流是不可能的。 您需要使用合适的第三方库,例如ncurses @Someprogrammerdude 我正在学习 C++ 你能解释一下如何使用它吗 【参考方案1】:

光标移动、功能键和其他特殊键在不同终端中的处理方式不同。但在大多数情况下会生成一些escape sequence

大多数语言中的程序提示都是从stdin 简单读取的,它将按原样读取转义序列。所以例如←[D,←[C对应左右光标移动。

如果您想像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

现在您应该可以使用左/右键在输入行中移动了。

【讨论】:

感谢它完美运行!!!! (一个简单的问题是没有任何库是可能的) 当然,如果图书馆这样做是可能的。这不是很容易。 Here's如何解析转义序列和here's如何向终端发送控制序列以移动光标位置。 非常感谢您的资源 我使用了它的工作方式并为它制作了一个 Java 库:- ***.com/a/66901865/14911094 还为所有语言编译了一个解决方案列表:- ***.com/a/66902152/14911094

以上是关于避免来自 C 或 C++ 标准输入流的控制序列(如 ^[[C)的主要内容,如果未能解决你的问题,请参考以下文章

避免来自 Python 标准输入流的控制序列(如 ^[[C)

IO流在C++中的应用

[C++]-C++基本输入及读取整行

C++ 标准输出控制小数点后位数的方法

C++ Primer 5th笔记(chap 17 标准库特殊设施)IO库 之操纵符

C++的IO流