首页 > 其他分享 >C语言中水平制表符 \t 与退格键 \b 的使用方法探索

C语言中水平制表符 \t 与退格键 \b 的使用方法探索

时间:2024-08-14 23:27:36浏览次数:8  
标签:ba 1234567890 C语言 空格 内容 printf 制表符 退格 ta

经个人实践,C语言中使用转义序列码(\t)会输出一个 8 个格数的组合,当 \t 之前的内容达到 8 * n 格时,后续内容出现在 8 * (n + 1) + 1 格。(式中 n >= 1,且为整数)

探索过程如下:
第一次在看到某大佬的科普中提到:

\b将输出位置左移一位

\t表示一个tab的距离即1个大空格,相当于4个小空格

上述代码的理解:

  \t\b\t\b 表示前进四个空格然后回退一个空格,做两次相同操作,于是数字1会定位到数字7对应的位置下方。

  \t\t\b\b 表示前进两个大空格然后再回退两个大空格,即将\t看成一个tab的效果,回退的是两个tab,所以最后回到最初位置,也就是数字0对应的位置下方。

  1. 但可能是文章时间久远,中间规范发生了变化,如今在个人的尝试下未能重现,代码如下:
int main() {
    printf("1234567890123456789012345678901234567890\n");  //参考格数个位用
    printf("0        1         2         3         4\n");  //参考格数十位用
    printf("\t\ba\n");
    printf("\t\b\t\ba\n");
    printf("\t\b\t\b\t\ba\n");
    printf("\t\b\t\b\t\b\t\ba\n");
    printf("\t\t\b\b1\n");
    printf("\t\t\t\b\b\b1\n");
    printf("\t\t\t\t\b\b\b\b1\n");
    printf("\t\t\t\t\t\b\b\b\b\b1\n");
    printf("0        1         2         3         4\n");  //参考格数十位用
    printf("1234567890123456789012345678901234567890\n");  //参考格数个位用
    return 0;
}

得到的结果是:

1234567890123456789012345678901234567890
0        1         2         3         4
       a
       a
       a
       a
              1
                     1
                            1
                                   1
0        1         2         3         4
1234567890123456789012345678901234567890

结果中无论一行中 \t\b 出现几次,内容 a 终会出现在第 8 格,而类 \t\t\b\b 的代码则会使内容 a 出现在 8 + 7 * n 格。结果明显不符合预期之后怀疑是 \t 可能会在与其它转义序列码组合时发生变化,或者是可能会与前面内容的长度(格数)有关。

  1. 首先考虑是 \t 可能会在与其它转义序列码组合时发生变化,因此进行了组合尝试,代码如下:
int main() {
    printf("12345678901234567890\n");
    printf("0        1         2\n");
    printf("\ta\n");
    printf("\ba\n");
    printf("\t\ba\n");
    printf("1234\t\ba\n");
    printf("12\b34\t\ba\n");
    printf("12\b34\ta\n");
    printf("12\a34\t\ba\n");
    printf("12\b\a34\t\ba\n");
    printf("12\a\b34\t\ba\n");
    printf("0        1         2\n");
    printf("12345678901234567890\n");
    return 0;
}

得到的结果是:

12345678901234567890
0        1         2
        a
a
       a
1234   a
134    a
134     a
1234   a
134    a
134    a
0        1         2
12345678901234567890

结果中如果不受 \t 后的转义序列码影响,内容 a 终会出现在第 8 格。因此可知,\t 后的内容并不会受到前面一部分的转义序列码影响。

  1. 既然前面猜想错误,那么就可能会与前面内容的长度(格数)有关,因此咋去除了一般 \t 前后的 \b 后进行了长度测试,代码如下:
int main() {
    printf("12345678901234567890\n");
    printf("0        1         2\n");
    printf("123456\ta\n");
    printf("1234567\ta\n");
    printf("12345678\ta\n");
    printf("123456789\ta\n");
    printf("1234567890\ta\n");
    printf("123456789012345\ta\n");
    printf("1234567890123456\ta\n");
    printf("1234567890\ta12\tb\n");
    printf("1234567890\t\b\b\b\b\b\b\ba12\tb\n");
    printf("1234567890\t\b\b\b\b\b\b\b\b\b\ba12\tb\n");
    printf("1234567890\b\b\b\ba12\tb\n");
    printf("0        1         2         3\n");
    printf("123456789012345678901234567890\n");
    return 0;
}

结果如下:

12345678901234567890
0        1         2
123456  a
1234567 a
12345678        a
123456789       a
1234567890      a
123456789012345 a
1234567890123456        a
1234567890      a12     b
123456789a12    b
123456a120      b
123456a120      b
0        1         2         3
123456789012345678901234567890

结果中可以发现,当第一个 \t 前的内容少于 7 格时,内容 a 总会出现在第 9 格;当第一个 \t 前的内容大于等于 8 格小于等于 15 格时内容 a 会出现在第 17 格,因此可以类比得出:\t 会输出一个 8 个格数的组合,当 \t 之前的内容达到 8 * n 格时,后续内容出现在 8 * (n + 1) + 1 格。

同时,根据最后三例结果:

123456789a12    b
123456a120      b
123456a120      b

可以得出:\b 会删去该序列组合左侧的空格,遇到非空格的内容会对该格进行覆盖占用,并在继续向左占用后恢复右侧未占用格中的内容。

探索仍在继续,过程可能出现错误,如能指出则万分感谢!

标签:ba,1234567890,C语言,空格,内容,printf,制表符,退格,ta
From: https://www.cnblogs.com/LXHLQR/p/18359953

相关文章

  • C语言函数(上)
    前言与概述笔者打算通过两篇文章详细介绍C语言函数的相关知识,本文章将会介绍C语言函数定义、C语言函数分类、函数参数、函数调用。下一篇文章将会介绍函数声明、链式访问,并详细介绍函数递归。笔者不才,如有错误,欢迎各位编程大佬在评论区批评指正。C语言函数定义维基百科中将C......
  • 关于C语言学习的第二天
    今天学习的是C语言,本次接着上次的内容继续开始,主要是说C语言中数据类型的内容,如有疑问可以翻找我上一篇关于C语言的内容。首先是冯诺依曼机,它规定指令和数据都是存储在内存中的,都是以二进制形式存储的。那为什么是使用二进制呢?因为这在电器元件中易实现,且双稳态元件较多。而二......
  • C语言基础11指针
    指针的引入为函数修改实参提供支持。为动态内存管理提供支持。为动态数据结构提供支持。为内存访问提供另一种途径。指针概述内存地址:系统为了内存管理的方便,将内存划分为一个个的内存单元(1个内存单元占1个字节),并为每一个内存单元进行了编号,内存单元的编号称为该......
  • c语言中输入问题,scanf遇到空格就会停止输入
    一.问题描述:在c语言当中使用scanf进行输入字符串时,遇到空格会停止输入,如下面的例子。#include<stdio.h>intmain(){ chars[30]; scanf("%s",s); printf("%s",s); return0;}如下图可看出当输入“Helloworld!”时,从输出可以看出只能读入“Hello”。二.原因:在C......
  • c语言转换char字符数组为大写小写
    #include<string.h>#include<stdlib.h>#include<stdio.h>#include<time.h>#include<ctype.h>#include<sys/stat.h>voidgetdate(char*datestr,char*format){ time_tnnowtime=time(NULL); structtm*ptmTemp=loc......
  • c语言替换字符串 Replace the first ‘oldstr‘ with ‘newstr‘ in ‘srcstr‘
    #include<string.h>#include<stdlib.h>#include<stdio.h>#include<time.h>#include<ctype.h>#include<sys/stat.h>voidgetdate(char*datestr,char*format){ time_tnnowtime=time(NULL); structtm*ptmTemp=loc......
  • C语言实现排序之归并排序算法
    一、归并排序算法基本思想        归并排序采用分治法策略,将数组递归地分成两半,然后对每一半进行排序,最后将两个已排序的子数组合并成一个完整的有序数组。步骤递归划分:将数组分成两半,直到每个子数组只有一个元素。递归排序:递归地对每个子数组进行排序。合并子数组......
  • C语言实现排序之堆排序算法
    一、堆排序算法基本思想堆排序是一种比较有效的排序方法,其基本思想是:构建最大堆:首先将待排序的数组构建成一个最大堆,即对于每个非叶子节点,它的值都大于或等于其子节点的值。排序:然后将堆顶元素(最大值)与堆的最后一个元素交换位置,将其移出堆,并调整剩余元素以保持最大堆的性质......
  • c语言中用整型格式化输出浮点型;还是用浮点型格式化输出整型都是不可行的
     001、整型格式化输出浮点型[root@PC1test]#lstest.c[root@PC1test]#cattest.c#include<stdio.h>intmain(void){doublei;//定义浮点型变量i=5.8;printf("i=%d\n",i);//用整型格式化输出浮......
  • C语言新手小白详细教程(7)指针和指针变量
    希望文章能够给到初学的你一些启发~如果觉得文章对你有帮助的话,点赞+关注+收藏支持一下笔者吧~阅读指南:开篇说明1、指针的定义接下来我们用图示的形式来解释一下指针:2、申明指针变量3、取地址符&4、为指针变量赋值5、间接运算符开篇说明本章节我们学习C语言......