linux printf'\b'删除显示在终端上的中文字符

写代码时想要用\b加空格删掉原本输出在终端上的字符,比如

printf("abc");
fflush(stdout);
printf("\b\b\b   ");

但是在删除中文字符的时候出现了问题
我的想法是:utf8的中文按3个字节存放,所以删除中文字符只要用3个退格+空格覆盖即可

printf("中文字符\b\b\b   \n");

然而结果是

img


前一个字符也被覆盖了……
最后发现只要2个\b,就正常了,但这是为什么?难度中文打印出来的时候只有两个字节??

printf("中文字符\b\b  \n");

中文 utf-8 不一定是三个字节 ,utf8是不定字节 长度由第一个字节标识
我也不清楚 但是 偶数中文和奇数中文 ,mingw 编译器 qt 会有一种编不过 在这里mark 下等答案

【以下回答由 GPT 生成】

对于这个问题,\b字符在终端中的作用是回退光标,但是它无法删除终端上已输出的字符。而且,中文字符在UTF-8编码中占用3个字节,并不是2个字节。

为了在终端上删除已输出的中文字符,可以使用一些其他的解决方案。以下是一种可能的方法:

使用ANSI转义序列。ANSI转义序列是在终端上控制光标位置和颜色的一种方法。在终端上删除一个字符,可以使用转义序列\033[K。以下是修改后的代码示例:

printf("中文字符");
fflush(stdout);
printf("\033[K");

这段代码在输出完中文字符后,调用fflush(stdout)强制刷新输出缓冲区,然后使用转义序列\033[K来清除当前行光标位置及其后的所有字符。这样就可以达到删除中文字符的效果。

希望这个解决方案对你有所帮助。如果有任何其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^