Как напечатать строку, не заканчивающуюся нулем, используя printf? - PullRequest
57 голосов
/ 26 января 2010

Как я могу напечатать строку с ненулевым символом в конце, используя printf, предполагая, что я знаю длину строки во время выполнения?

Ответы [ 2 ]

97 голосов
/ 26 января 2010
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's answer для подробного объяснения.

16 голосов
/ 04 августа 2014

Ответ, предоставленный @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...