一阵三十六 发表于 2021-9-30 20:45:01

关于 \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 20:52:34

本帖最后由 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:03:04

也许

一阵三十六 发表于 2021-9-30 21:17:24

本帖最后由 一阵三十六 于 2021-9-30 21:18 编辑

jhq999 发表于 2021-9-30 20:52
不是删除是覆盖

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

这段代码其实我看不懂....

jhq999 发表于 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;
}

一阵三十六 发表于 2021-10-1 07:59:24

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 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;
}






jhq999 发表于 2021-10-1 08:49:07

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

擦除结束不还是覆盖?直接覆盖不就得了吗?

18408238295 发表于 2021-10-1 09:01:03

学习

hrpzcf 发表于 2021-10-1 09:06:16

jhq999 发表于 2021-10-1 08:49
擦除结束不还是覆盖?直接覆盖不就得了吗?

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

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

有什么不对吗?有不对的请补充。

jhq999 发表于 2021-10-1 09:19:07

真正的过程是什么?
我理解应该是在输出前已经把字符串处理好,然后输出,\b只不过告诉你\b后面字符串在那里开始覆盖字符串

jhq999 发表于 2021-10-1 09:50:11

本帖最后由 jhq999 于 2021-10-1 09:51 编辑

一阵三十六 发表于 2021-10-1 07:59
这个代码运行出现警告了....
信息如下:

这是我vs运行的结果

jhq999 发表于 2021-10-1 10:09:23

在使用Dev-c++时出现:

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

在for循环里声明变量只允许在C99或C11模式, 需要在工具(Tools)/编译选项(complier option)/代码生成下的语言标准选择C99
页: [1]
查看完整版本: 关于 \b 的用法疑惑