Как я могу напечатать строку с нулевым завершением с использованием printf, считая, что знаю длину строки во время выполнения?
Как напечатать строку с нулевым завершением с помощью printf?
Ответ 1
printf("%.*s", length, string);
Используйте вместе с другими аргументами:
printf("integer=%d, string=%.*s, number=%f", integer, length, string, number);
// ^^^^ ^^^^^^^^^^^^^^
В C вы можете указать максимальную длину для вывода в формате %.123s
. Это означает, что длина вывода не более 123 символов. 123
можно заменить на *
, так что длина будет взята из аргумента printf вместо жестко запрограммированного.
Обратите внимание, что это предполагает, что string
не содержит внутренних нулевых байтов (\ 0), поскольку %.123s
ограничивает максимальную длину не точной длиной, а строки по-прежнему обрабатываются как завершающие нуль.
Если вы хотите напечатать строку с нулевым завершением с внутренним нулем, вы не сможете использовать один printf. Вместо этого используйте fwrite
:
fwrite(string, 1, length, stdout);
Подробнее см. @M.S.Dousti.
Ответ 2
Ответ, предоставленный @KennyTM, велик, но с тонкостью.
В общем случае, если строка не равна нулю, "завершается", но имеет средний символ в середине, printf("%.*s", length, string);
работает не так, как ожидалось. Это связано с тем, что строка формата %.*s
запрашивает printf
для печати максимум символов length
, а не точно length
символов.
Я предпочел бы использовать более общее решение, указанное @William Pursell в комментарии в OP:
fwrite(string, sizeof(char), length, stdout);
Вот пример кода:
#include <stdio.h>
int main(void) {
size_t length = 5;
char string[length];
string[0] = 'A';
string[1] = 'B';
string[2] = 0; // null character in the middle
string[3] = 'C';
string[4] = 'D';
printf("With printf: %.*s\n", length, string);
printf("With fwrite: ");
fwrite(string, sizeof(char), length, stdout);
printf("\n");
return 0;
}
Вывод:
With printf: AB
With fwrite: AB CD