鱼C论坛

 找回密码
 立即注册
查看: 1468|回复: 12

[已解决]关于 \b 的用法疑惑

[复制链接]
发表于 2021-9-30 20:45:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 一阵三十六 于 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个字符,

想不明白这是什么原理.....

运行结果如下:
966.png



怎么world就到了FishC后面呢???

最佳答案
2021-10-1 08:21:19
本帖最后由 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;
}

屏幕截图 2021-10-01 082417.png

屏幕截图 2021-10-01 082340.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-30 20:52:34 | 显示全部楼层

回帖奖励 +15 鱼币

本帖最后由 jhq999 于 2021-9-30 21:01 编辑

不是删除是覆盖
int main()
{       
        char ch[256]={"hello world"};

        for (int i = 0; i < 16; i++)
        {    
                ch[11+i]='\b',ch[11+i+1]='F',ch[11+i+2]='\n';
                printf(ch);

        }
        return 0; 
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-30 21:03:04 | 显示全部楼层

回帖奖励 +15 鱼币

也许
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-30 21:17:24 | 显示全部楼层
本帖最后由 一阵三十六 于 2021-9-30 21:18 编辑
jhq999 发表于 2021-9-30 20:52
不是删除是覆盖


可以详细说一下吗?
不能理解....

这段代码其实我看不懂....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-30 23:04:49 | 显示全部楼层
本帖最后由 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-1 07:59:24 | 显示全部楼层
jhq999 发表于 2021-9-30 20:52
不是删除是覆盖

这个代码运行出现警告了....
信息如下:
                  In function 'main':
5        9           [Error] 'for' loop initial declarations are only allowed in C99 or C11 mode
5        9           [Note] use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code

8        17                [Warning] incompatible implicit declaration of built-in function 'printf'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 08:21:19 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +15 鱼币

本帖最后由 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;
}

屏幕截图 2021-10-01 082417.png

屏幕截图 2021-10-01 082340.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 08:49:07 | 显示全部楼层
hrpzcf 发表于 2021-10-1 08:21
书上的解释是 \b 使光标左移,不擦除字符,但在某些实现中运行是擦除的

擦除结束不还是覆盖?直接覆盖不就得了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 09:01:03 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-1 09:06:16 | 显示全部楼层
jhq999 发表于 2021-10-1 08:49
擦除结束不还是覆盖?直接覆盖不就得了吗?

楼主以为 \b 删除字符,问为什么 \b 只能删除5个字符

我回答 \b 不删除字符,只是左移光标, \b 后面的 FishC 只覆盖了 hello,word 没有被覆盖,让楼主误以为只能删除 5 个字符。

有什么不对吗?有不对的请补充。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 09:19:07 | 显示全部楼层
真正的过程是什么?
我理解应该是在输出前已经把字符串处理好,然后输出,\b只不过告诉你\b后面字符串在那里开始覆盖字符串
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 09:50:11 | 显示全部楼层
本帖最后由 jhq999 于 2021-10-1 09:51 编辑
一阵三十六 发表于 2021-10-1 07:59
这个代码运行出现警告了....
信息如下:


这是我vs运行的结果
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 10:09:23 | 显示全部楼层
在使用Dev-c++时出现:

[Error] 'for' loop initial declarations are only allowed in C99 or C11 mode

在for循环里声明变量只允许在C99或C11模式, 需要在工具(Tools)/编译选项(complier option)/代码生成下的语言标准选择C99
20180924171632127.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 11:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表