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个空格。

    总结:

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

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

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

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

  • 相关阅读:
    oracle中Blob和Clob类型的区别
    为什么要分库分表
    Enable file editing in Visual Studio's debug mode
    SQL Server Dead Lock Log
    Debug .NET Framework Source
    SQL Server text field里面有换行符的时候copy到excel数据会散乱
    诊断和修复Web测试记录器(Web Test Recorder)问题
    Can't load Microsoft.ReportViewer.ProcessingObjectModel.dll
    'telnet' is not recognized as an internal or external command
    Linq to XML
  • 原文地址:https://www.cnblogs.com/zhichao-yan/p/13368509.html
Copyright © 2011-2022 走看看