11

我想在 C 中使用 printf 打印列。我写了这段代码:

#include <stdio.h>

void printme(char *txt1, char *txt2, char *txt3)
{
    printf("TXT1: %9s TXT2 %9s TXT3 %9s\n", txt1, txt2, txt3);
}


int main()
{
    printme("a","bbbbbbbeeeeebbbbb","e");
    printme("aaaaaaaa","bbbbbbbbbbbb","abcde");
    return 0;
}

它有效,但我有这样的输出:

TXT1:         a TXT2 bbbbbbbeeeeebbbbb TXT3         e
TXT1:  aaaaaaaa TXT2 bbbbbbbbbbbb TXT3     abcde

所以列不等宽。基本上,我想让它像这样,无论我的参数中的文本有多长,我的函数总是会打印出一个很好的格式化列。问题是:我该怎么做?

说得好,我的意思是无论我传递给打印函数的文本有多长,它总是会打印出等宽的列,例如:

我的输出如下所示:

a         cd`           fg           ij  
a         cd             fg           ij  
a         cd             fg           ij  
ab         cd             fg           ij  
ab         cd             fg           i j   
ab         cd             fg           ij  
ab         cd             fg           ij  
ab         cde             fgh         ij  
ab         cde             fgh         ij  

我希望它看起来像这样(无论我的文本参数有多长):

a         cd`           fg           ij  
a         cd            fg           ij  
a         cd            fg           ij  
ab        cd            fg           ij  
ab        cd            fg           ij   
ab        cd            fg           ij  
ab        cd            fg           ij  
ab        cde           fgh          ij  
ab        cde           fgh          ij    
4

4 回答 4

13

如果您希望字符串大于列宽时被截断,那么您只需为字符串格式规范添加一个精度:

printf("TXT1: %9.9s TXT2 %9.9s TXT3 %9.9s\n", txt1, txt2, txt3);

这样printf(),您的示例程序的输出如下所示:

TXT1:         a TXT2 bbbbbbbee TXT3         e
TXT1:  aaaaaaaa TXT2 bbbbbbbbb TXT3     abcde
于 2013-07-19T18:30:29.720 回答
4

您可以找到、 和的最大长度txt1,然后对其进行格式化:txt2txt3

// compute the max string length of txt1 inputs in advance
int s1 = strlen(firstTxt1);
if (s1 < strlen(secondTxt1)
    s1 = strlen(secondTxt1);
...

printf("%.*s %.*s %.*s\n", s1, txt1, s2, txt2, s3, txt3);
于 2013-07-19T17:19:25.483 回答
3

看看我的简单库libtprinthttps ://github.com/wizzard/libtprint 代码很简单,你应该能够理解它是如何工作的。

基本上,您需要的是使用每列的字段宽度并计算对齐偏移量。

希望能帮助到你 !

于 2013-07-19T19:40:17.710 回答
3

不幸的是,没有 TRIVIAL 方法可以做到这一点。

您可以执行两遍方法 - 在 main() 中:

char **data[] = { { "a","bbbbbbbeeeeebbbbb","e" }, 
                  {"aaaaaaaa","bbbbbbbbbbbb","abcde" } };


get_columwidths(data[0][0], data[0][1], data[0][2]); 
get_columwidths(data[1][0], data[1][1], data[1][2]); 

printme(data[0][0], data[0][1], data[0][2]); 
printme(data[1][0], data[1][1], data[1][2]); 

然后这个:

int columnwidths[3];

void get_columwidths(const char *s1, const char *s2, const char *s3)
{
    int len1 = strlen(s1); 
    int len2 = strlen(s2); 
    int len3 = strlen(s3); 

    if (columnwidths[0] < len1) columnwidths[0] = len1;
    if (columnwidths[1] < len2) columnwidths[1] = len2;
    if (columnwidths[2] < len3) columnwidths[2] = len3;
}

void printme(char *txt1, char *txt2, char *txt3)
{
    printf("TXT1: %*s TXT2 %*s TXT3 %*s\n", 
           columnwidths[0], txt1, columnwidths[1], txt2, columnwidths[2], txt3);
}
于 2013-07-19T17:23:17.330 回答