背景
为了使打印对齐、输出美观,趁着这次机会研究下tab的对齐方式,以后不再盲目手动调整了,狗头hh。
tab对齐,此文档描述的不正确,但是原作者的思路很有借鉴意义,本文将引用并对tab对齐重新说明如下:
红皮书《C语言程序设计(第四版)》谭浩强 著Page40关于 \t
的说明是:水平制表符,将当前位置移到下一个tab位置。
平时工作中常使用notepad++文本编辑工具,为了编码缩进时空格和tab不混用,每行行首只采用TAB缩进,打开了View->Show Symbol-> Show White Space and TAB。在实际使用时发现,
第一行是我为了说明tab的位置给的一个参考,此时一个tab代表4个空格,执行tab前总共有4种情况:有0个字符、有1个字符… 有4个字符【其中,有4个字符和有0个字符是一种情况】,可以发现,tab动作跳过的空格数分别是4、3、2、1,不同空格数都是为了跳到下一个tab位置。
其实刚开始接触 tab
概念时,我以为一个 tab
就是从当前光标位置往后跳4个空格或者8个空格。
原观点剖析
-
原观点 - tab对齐 呈上,和原博主云上握握手,hh
-
下面分2点对原博文做分析
2.1. 测试
自测与博主一致,如下图所示。其中1个tab
代表8个空格,看了背景的话,这个结果我们就不奇怪了。
2.2. 公式
1). tab跳过的空白个数按照博主的公式有一些情况不满足,比如这个评论。2). 引用:所以我们看到当\t前面为123456时,后面有两个空格;当\t前面为1234567时,后面有1个空格,而当前面正好为12345678时,后面跟8个空格
--> 根据公式来的话,结果将依次是2、1、0【与实际不符】3).
\t
将要跳过的空格个数spaceNum
公式修改如下:spaceNum = 8 - (n % 8),其中n表示
\t
前面的字符的个数。项 结果 \t前面为123456时 2 \t前面为1234567时 1 \t前面为12345678时 8 \t前面为123456789时 7 公式原理说明,以1个tab代表8个空格进行说明:
a. 从测试实例的规律来看,可参考图2.1. 测试
中的图片,其实\t
前面的字符个数实际上可以归纳为有限的8种情况,正处于tab位置上、偏移1个空格位置、偏移2个空格位置 … 偏移7个空格位置、偏移8个空格位置【又刚好处于下一个tab位置上】。
b. 对于这8种情况,对应的空格数量依次是8、7 … 1。
c. 由a和b可以得到公式spaceNum = 8 - (n % 8),其中n表示
\t前面的字符的个数。
如何设计对齐
实际中其实没有必要这么麻烦,如果想要在printf中的格式输出与预想一致,可以先设计好,然后根据设计结果修改printf中的格式,最后再微调下,就可以达到预期。
修改后的输出
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char* argv)
{
printf("123456\t\t123\t45\n");
printf("12\t\t123456\t78\n");
printf("---------------------------------------\n");
printf("1234567\t\t123\t45\n");
printf("12\t\t123456\t78\n");
printf("---------------------------------------\n");
printf("12345678\t123\t45\n");
printf("12\t\t123456\t78\n");
printf("---------------------------------------\n");
printf("123456789\t123\t45\n");
printf("12\t\t123456\t78\n");
printf("---------------------------------------\n");
printf("123456781234\t123\t45\n");
printf("12\t\t123456\t78\n");
return 0;
}