Печать столбцов равной ширины в C с помощью форматирования printf
Я хотел бы печатать столбцы с помощью printf в C. я написал этот код:
#include <stdio.h>
void printme(char *txt1, char *txt2, char *txt3)
{
printf("TXT1: %9s TXT2 %9s TXT3 %9sn", 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
4 ответов
вы можете найти максимальную длину для 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);
Если вы хотите, чтобы строки были усечены, если они больше ширины столбца, то вы можете просто добавить точность для спецификации формата строки:
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
к сожалению, для этого нет тривиального метода.
вы можете сделать двухпроходный метод-в 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);
}
посмотрите на мою простую библиотеку, libtprint: https://github.com/wizzard/libtprint Код довольно прост, вы должны понимать, как он работает.
в основном вам нужно играть с шириной полей для каждого столбца и рассчитать смещения выравнивания.
надеюсь, что это помогает !