关于 \b 的用法疑惑
本帖最后由 一阵三十六 于 2021-9-30 20:47 编辑#include <stdio.h>
int main()
{
printf(" hello world\b\b\b\b\b\b\b\b\b\b\b FishC\n");
return 0;
}
关于我对\b的认识:
首先 \b 相当于键盘上的backspace 键即退格键,
在上面的代码中,\b的数量是小于前面的字符数量的
我的理解是:
退格符将删除前面对应数量的字符
然而:
经不严谨测试,连续的\b只能删除5个字符,
想不明白这是什么原理.....
运行结果如下:
怎么world就到了FishC后面呢???
本帖最后由 jhq999 于 2021-9-30 21:01 编辑
不是删除是覆盖
int main()
{
char ch={"hello world"};
for (int i = 0; i < 16; i++)
{
ch='\b',ch='F',ch='\n';
printf(ch);
}
return 0;
} 也许 本帖最后由 一阵三十六 于 2021-9-30 21:18 编辑
jhq999 发表于 2021-9-30 20:52
不是删除是覆盖
可以详细说一下吗?
不能理解....
这段代码其实我看不懂.... 本帖最后由 jhq999 于 2021-9-30 23:06 编辑
一阵三十六 发表于 2021-9-30 21:17
可以详细说一下吗?
不能理解....
运行一下我上面的代码
再运行一下
int main()
{
printf(" hello world\b\b\b\b\b\b\b\b\b\b\b");
return 0;
} jhq999 发表于 2021-9-30 20:52
不是删除是覆盖
这个代码运行出现警告了....
信息如下:
In function 'main':
5 9 'for' loop initial declarations are only allowed in C99 or C11 mode
5 9 use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code
8 17 incompatible implicit declaration of built-in function 'printf' 本帖最后由 hrpzcf 于 2021-10-1 09:31 编辑
书上的解释是 \b 使光标左移,不擦除字符,但在某些实现中运行是擦除的
你以为它只能删除5个字符,实际上不是,你的代码中:多个 \b 已经把光标移到字符开头,但是原字符没有被擦除,后面打印的 FishC仅覆盖了 hello 那一块,word 没有被覆盖到,让你误以为只能删除5的字符,把 \b 后的字符加长就能看到区别。
#include <stdio.h>
int main()
{
printf(" hello world\b\b\b\b\b\b\b\b\b\b\b FishC1234567890\n");
return 0;
}
hrpzcf 发表于 2021-10-1 08:21
书上的解释是 \b 使光标左移,不擦除字符,但在某些实现中运行是擦除的
擦除结束不还是覆盖?直接覆盖不就得了吗? 学习 jhq999 发表于 2021-10-1 08:49
擦除结束不还是覆盖?直接覆盖不就得了吗?
楼主以为 \b 删除字符,问为什么 \b 只能删除5个字符
我回答 \b 不删除字符,只是左移光标, \b 后面的 FishC 只覆盖了 hello,word 没有被覆盖,让楼主误以为只能删除 5 个字符。
有什么不对吗?有不对的请补充。
真正的过程是什么?
我理解应该是在输出前已经把字符串处理好,然后输出,\b只不过告诉你\b后面字符串在那里开始覆盖字符串 本帖最后由 jhq999 于 2021-10-1 09:51 编辑
一阵三十六 发表于 2021-10-1 07:59
这个代码运行出现警告了....
信息如下:
这是我vs运行的结果 在使用Dev-c++时出现:
'for' loop initial declarations are only allowed in C99 or C11 mode
在for循环里声明变量只允许在C99或C11模式, 需要在工具(Tools)/编译选项(complier option)/代码生成下的语言标准选择C99
页:
[1]