2013-07-19 3 views
11

Я хотел бы напечатать столбцы, используя Printf в C. Я написал этот код:печати равной ширины столбцов в 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 

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

По saing хорошего Я имел в виду, что независимо от того, сколько времени текста переходит к моей функции печати, она всегда будет печатать равную ширину столбцов, например:

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

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  
+2

Определить * nice * in * nice formatted columns *. – ouah

+2

, так что сканируйте свой текст заранее, выясните, какая самая длинная строка, и используйте эту длину для значений заполнения столбца. –

+0

Возможно дубликат http://stackoverflow.com/questions/2956296/printing-values-in-special-format-using-printf –

ответ

4

You можно найти максимальную длину 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); 
+0

Что произойдет, если у вас есть непрерывный выход (например,непрерывно печатая информацию в табличную структуру), и внезапно данные для одного столбца длиннее всех его предшественников (колонка должна быть расширена)? Я знаю '\ b' и' \ r', но они действительно не решают эту проблему. – Arc676

+0

Возможно, это мой компилятор, но почему этот метод не работает для меня? 'printf («%. * s », 5,« hi »);' просто печатает «привет», как будто длина не указана, но '% 5s' отлично работает. У вас есть ссылки, которые подробно объясняют это подробно? Я предполагаю, что поисковый запрос Google будет «форматировать в printf»? – Arc676

3

К сожалению, нет тривиального способа сделать это.

Вы могли бы сделать метод двупроходного - в основном():

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); 
} 
+0

+1, потому что вместо '%. * S' вместо'%. * S' (обратите внимание на период), как и в принятом ответе, этот метод делает _not_ печатать ведущие нули при печати целых чисел ('% * d'). – Arc676

8

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

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 
2

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

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

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