Подтвердить что ты не робот

Строка printf, элемент переменной длины

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

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

4b9b3361

Ответ 1

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

Например:

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

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

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

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

Ответ 2

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

char *fmt_string;

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

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