Печать столбцов с одинаковой шириной в C с использованием форматирования printf

Я хотел бы печатать столбцы с помощью printf в C. Я написал этот код:

#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

Итак, столбцы не равны. В основном, я хотел бы сделать так, что независимо от того, как долго текст в моем аргументе, моя функция ВСЕГДА распечатывает красивые форматированные столбцы. Вопрос в следующем: как я могу это сделать?

С помощью nice я имел в виду, что независимо от того, как долго текст передается моей функции печати, он всегда будет печатать столбцы с одинаковой шириной, например:

У меня есть этот вывод, который выглядит так:

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    

Ответ 1

Вы можете найти максимальную длину для txt1, txt2 и txt3, а затем отформатировать ее:

// 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);

Ответ 2

Если вы хотите, чтобы строки были усечены, если они больше ширины столбца, вы можете просто добавить точность для спецификации формата строки:

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

Ответ 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);
}

Ответ 4

Взгляните на мою простую библиотеку, libtprint: https://github.com/wizzard/libtprint Код довольно прост, вы должны понимать, как он работает.

В основном вам нужно играть с шириной полей для каждого столбца и вычислять смещения выравнивания.

Надеюсь, что это поможет!