C++:标准输出中没有显示退格字符?

C++: Backspace characters not showing in stdout?

我正在实施具有命令历史记录的 shell。当用户按下向上或向下箭头时,当前行中的文本将替换为上一个或下一个命令。

我计划实施的算法相当简单。如果当前命令有k个字符,我输出k个'\b'字符来删除当前行的k个字符,然后将选择的命令输出到该行。

但是,我试图从一些基本的东西开始,例如查看输出 '\b' 字符是否甚至可以删除当前 stdout 行中的字符:

#include <iostream>
#include <queue>
#include <deque>
#include <string>

using namespace std;

int main(int argc, char *argv[]){
    cout << "asdf";
    cout << "\b\b" << endl;
    return 0;
}

上面这段代码的输出是:

asdf

当我期望时:

as

重要:我想在输出到stdout.

后删除字符

我推荐使用 ncurses 和 readline 库。

示例:

sudo apt-get install libncurses5-dev libncursesw5-dev libreadline-dev
git clone https://github.com/ulfalizer/readline-and-ncurses
cd readline-and-ncurses 
make
rlncurses

我的环境:

lsb_release -d ; uname -r ; g++ --version | head -1
Description:    Ubuntu 20.04.3 LTS
4.4.0-19041-Microsoft
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

您需要 ANSI 转义码。尝试:

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[]){
    cout << "asdf";
    cout<<"\b\b\b\b3[J";
    return 0;
}

3 代表 ESC[J 是代码的参数。 ESC[J 清除从光标到屏幕末尾的屏幕。更多信息:https://en.wikipedia.org/wiki/ANSI_escape_code#Fe_Escape_sequences

作为@n。 1.8e9-where's-my-share m.提到,对于大多数实现,\b 只是将光标向后移动 space,并且不会重写任何内容。