C语言控制台打印输出整齐问题

关键词控制台\打印\制表符\空格\格式控制符\列\对齐\ 
初衷:
经常写程序时需要打印输出,然后每次又打印的一团糟糕,我又是一个接近强迫症和略微完美主义者,碰巧好像网上没有我所需要的帖子,所以经过探索之后得到这些如何让自己在控制台打印输出整齐的Tips,同时和大家分享!鄙人水平不够,有错还望指教

首先你需要明白的影响打印整齐控制的因素:

1.制表符(8个空格)

2.键盘输入一个空格(一个空格)

3.格式控制符(具体空格情况不同,见下)

4.打印的内容(英文数字占一个空格,汉子2个空格,其他标点符号基本一个空格)


\t 制表符  占八个空格
我的理解:
制表符顾名思义是如同划分表格一般将将面分割成8个空格为1个大格的表
系统在检测到\t时,会自动统计:从上一个\t控制的大格子尾部到此\t所占的空格数(空格即位数即列数)。

\t会根据统计到前面输出占有的空格数对后面进行补空格输出。

假如统计空格数为N,则补齐Num=8-N%8个空格(7个补一个,8个补8个,8个补7个,12个补4个)

参考(转义字符

格式控制符控制的位数 如%10s、%4.2d等等  参考格式控制符详细

举个例子:

对于%10s,如果实际打印没超过格式规定长度10,则计算的空格数数为10,如果超过10,则按实际长度计算 ,如果打印了6个字,占12个空格,则计数的空格数为12.

5) 键盘自己敲入的空格也会被统计在内(相信大家经常敲入空格来使打印进退),即如果在%10s前空了4个空格,则统计要加上空格数。

举例说明:

我现在要打印一些车辆的信息,我想让上面的类别信息和下面打印的数据对齐(一开始我们没有添加\t)

printf("当前信息库中共有%d台车辆信息\n",M);
printf("车主姓名车牌号码汽车品牌车长车高购买年份\n");
for(int i=0;i<M;i++)
{
    Car B;
    fread(&B,sizeof(Car),1,fp);
            printf("%-7s\t%-7s%-5s%-4.2f%-4.2f%-4d\n",B.owner,B.Card,B.brand,B.height,B.weight,B.year);
}
printf("\n");

首先对于打印车主姓名列:

打印类别信息''车主姓名占8个空格

打印格式控制符为%-7s,一般姓名为3个汉字占6格,这里设置位数为7,所以在接下来的\t前面有7个,故会补一个空格,\t作用结束

显示为:

车主姓名占了8个空格,红色方框宽度为7个空格,由格式控制符控制,后面的空格为\t补齐

当%mS中m<7时结果都为上图,只是红色框图会变窄,绿色框变宽,因为占得空格变小,\t在后面补齐的空格增多

那么当%mS中m>=8&&m<16时如何:

此时统计起前面空格为m>8,于是补空格N=8-m%8空格,假如m=8,则补8个空格

结果如图:

补了八个空格与上面的车牌号码整个对齐了

当然我们不想这样对齐,我想和车牌号对齐,于是在车主姓名后面加了\t

变成printf("车主姓名\t车牌号码汽车品牌车长车高购买年份\n");

结果:

车主姓名有8个空格,遇上\t会再补8个空格。于是对齐了。

但是我觉得不好看,我觉得空太宽了,所以代码变为

格式控制符为%-7s ,\t会补一个空格。

结果如图:

红色方框为7个空格位,由格式控制符控制,绿色为\t补充的一个空格,黄色方框是printf语句中空的4个空格打印出来的效果

看上去稍微舒服了一些,之前空太宽了。

现在我想将车牌号码和汽车品牌分隔开来,于是给它们中间加\t.

车牌为1个汉字加6个英文数字组合,计算的8个空格,前面黄色方框占了4个空格,统计共12个空格,预计\t要补4个空格

“车牌号码”占4个空格,前面键盘输入4个空格,统计共12个空格,预计其后\t补4个空格

结果如图:

蓝色宽占4格,为\t补出来的4个空格。

 

总结:

讲到这里其实差不多了,后面的数据对齐其实道理差不多。

举例子会比较生动,知道各种数据内容打印出来所占的格数后,通过用自己加空格和加\t的方法,调整使数据对齐。

希望大家能够通过这个能够举一反三。

我写下这个帖子也是为了我更好的掌握,这就是所谓的费曼学习法吧。

 

 

 

 

posted on 2019-07-08 17:20  偷影子的人儿  阅读(51)  评论(0编辑  收藏  举报