Как напечатать строку с нулевым завершением с помощью 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