2016-03-29 2 views
1

Спасибо за ваше время, проведенное здесь. У меня есть вопрос с snprintf(), когда размер = 0, с кодом ниже:snprintf() возвращаемое значение, когда размер = 0

#include <stdio.h> 
#include <stdlib.h> 

int main(int ac, char **av) 
{ 
    char *str; 
    int len; 

    len = snprintf(NULL, 0, "%s %d", *av, ac); 
    printf("this string has length %d\n", len); 

    if (!(str = malloc((len + 1) * sizeof(char)))) 
     return EXIT_FAILURE; 

    len = snprintf(str, len + 1, "%s %d", *av, ac); 
     printf("%s %d\n", str, len); 

    free(str); 

    return EXIT_SUCCESS; 
} 

когда я бегу:

[email protected]:~/TestCode$ ./Test_snprintf 

Результат:

this string has length 17 
./Test_snprintf 1 17 

Что меня смущает в коде размер, который должен быть записан, равен 0, почему отображается 17?

Что я пропустил

Спасибо ~~

ответ

1

Решение может быть найдено in the man page под Return value;

Функции snprintf() и vsnprintf() не больше байтов, чем размер (включая завершающий нулевой байт ('\ 0')). Если результат был усечен из-за этого предела, возвращаемое значение равно количество символов (исключая завершающий нулевой байт), которые были бы записаны в финальную строку, если бы было достаточно места.

Это так, что вы можете делать то, что вы делаете, «пробная печать», чтобы получить правильную длину, а затем выделить буфер динамически получить весь вывод, когда вы снова snprintf в выделенном буфер.

+0

Я вижу. Спасибо ~~~ – momoxinduo

+0

, почему первый snprintf может писать указателю NULL? – momoxinduo

+0

@momoxinduo Вы передаете 'NULL', чтобы получить только длину, чтобы вы могли динамически выделять память для выполнения реальной печати. Именно то, что делает ваш код. –

Смежные вопросы