zoukankan      html  css  js  c++  java
  • C语言控制台打印输出整齐问题

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

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

    1.制表符(8个空格)

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

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

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


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

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

    假如统计空格数为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个空格,则统计要加上空格数。

    举例说明:

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

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

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

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

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

    显示为:

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

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

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

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

    结果如图:

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

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

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

    结果:

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

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

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

    结果如图:

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

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

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

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

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

    结果如图:

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

    总结:

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

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

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

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

  • 相关阅读:
    每一次面试都是提升(一)
    Gof设计模式分组
    MSSqlServer 通过sql语句 还原数据库(已有备份文件)
    自定义配置节与配置节的读取
    Javascript判断时间大小的方法
    C#微信开发之旅(十三):V2订单查询&退款(完结)
    C#微信开发之旅(十二):V2告警接口&维权接口
    C#微信开发之旅(十一):V2发货接口
    C#微信开发之旅(十):APP预支付及支付参数生成(V2)
    C#微信开发之旅(九):JSAPI支付(V3)
  • 原文地址:https://www.cnblogs.com/zhichao-yan/p/13368509.html
Copyright © 2011-2022 走看看