对于\b,起初,我在c primer plus中看到,\b解释为退格,代表backspace,退格键,但经过我的测试,其实这个退格键和键盘上的backspace不一样,并不会删除文本,而是移动光标的位置作用。
如下面这段程序
#include<stdio.h>
int main()
{
printf("12345\b");
}
结果是
12345
所以\b没有像键盘上的一样,是往左删除文字
而下面这个程序
#include<stdio.h>
int main()
{
printf("12345\ba");
}
会输出
1234a
因此光标从5的右边一格向左移动一格到了5处,再输出a,而光标此时在5处,故占用这个位置,用a把5给覆盖了。
(注意:在输出完12345后,光标在5右边,因为输出完5,光标自然往右移动一格)
对于多个\b同理,移动光标位置,从移动后的光标位置处输出\b后面的内容。
如
#include<stdio.h>
int main()
{
printf("12345\b\b\b\babc");
}
输出
1abc5
对于汉字,字母,数字,一个均只占一格位置,计算机对\b的处理都是一样的,均和上述同理
另外,如果\b前面出现的\n换行符,则要注意一下。
注意:发生换行后,是不能退格到上一行的
#include<stdio.h>
int main()
{
scanf("%d");
printf("\n");
scanf("%d");
}
如上面的程序,在输入一个数字后发生换行,而此时想要在键盘上按退格回到上一行,是不行的,光标会停留在换行后的这一行。(同学们可以自己试试看,确实如此)
因此
如果仅是
#include<stdio.h>
int main()
{
printf("1234\n5");
}
则会输出
1234
5
故退格只能发生在含5的这一行中,而不能退格回到上一行,光标只能停留在5这里
所以对于这个程序
#include<stdio.h>
int main()
{
printf("1234\n5\b\b\b\babc");
}
会输出
1234
abc
最后总结一下:\b在C程序中是向左移动光标的作用,而不是键盘上的退格,并且如果\b左边有\n,则要考虑换行后不能退格回到上一行,只能留在本行的问题。
PS:评论区有指出在 VS 中 \b 是向左边删除一个字符的作用,笔者测试后发现在 Ubuntu18.04 中使用 gcc 编译 12345\b 确实同样只是 1234,如下图:
但是如果在 \b 的后面再加上一个 \n 就会输出 12345【\t 同理】,如下:
可见在 VS 中 \b 也不是删除的作用。
但具体原理笔者没有搞清楚,应该要分析 printf 源码机制,有理解的大佬欢迎评论区指出!