printf - 使用tab进行对齐

背景

  为了使打印对齐、输出美观,趁着这次机会研究下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个空格。

原观点剖析

  1. 原观点 - tab对齐 呈上,和原博主云上握握手,hh

  2. 下面分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;
}

在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值