строка printf, элемент переменной длины - PullRequest
38 голосов
/ 09 мая 2011
#define SIZE 9
int number=5;
char letters[SIZE]; /* this wont be null-terminated */
... 

char fmt_string[20];
sprintf(fmt_string, "%%d %%%ds", SIZE);
/* fmt_string = "%d %9d"... or it should be */

printf(fmt_string, number, letters);

Есть ли лучший способ сделать это?

Ответы [ 2 ]

105 голосов
/ 09 мая 2011

Нет необходимости создавать строку специального формата. printf позволяет вам указать точность, используя параметр (который предшествует значению), если вы используете .* в качестве точности в теге формата.

Например:

printf ("%d %.*s", number, SIZE, letters);

Примечание: существует различие между шириной (которая является минимальной шириной поля) и точностью (которая дает максимальное количество символов для печати). %*s определяет ширину, %.s определяет точность. (и вы также можете использовать %*.*, но тогда вам нужно два параметра, один для ширины, один для точности)

См. Также страницу руководства printf (man 3 printf под Linux) и особенно разделы о ширине и точности поля:

Вместо строки десятичных цифр можно написать «*» или «* m $» (для некоторых десятичное целое число m), чтобы указать, что точность задана в следующем аргумент или, соответственно, m-й аргумент, который должен иметь тип int.

5 голосов
/ 09 мая 2011

Несколько неизвестная функция: asprintf.Первый параметр - **char.Эта функция будет malloc места для строки, поэтому вам не нужно вести бухгалтерию.Не забудьте free строку, когда закончите.

char *fmt_string;

asprintf(&fmt_string, "%%d %%%ds", SIZE);
printf(fmt_string, number, letters);
free(fmt_string);

является примером использования.

...