предсказать длину строки sprintf ()? - PullRequest
2 голосов
/ 17 марта 2011

Есть ли где-нибудь функция, которую я могу использовать, чтобы предсказать пространство, которое потребуется sprintf ()?IOW, я могу вызвать функцию size_t Forex_space ("% s \ n", some_string), которая будет возвращать длину C-строки, которая будет получена из sprintf ("% s \ n", some_string)?

Ответы [ 4 ]

9 голосов
/ 17 марта 2011

In C99 snprintf (примечание: Windows и SUSv2 не обеспечивают реализацию snprintf (или _snprintf), соответствующую стандарту) :

       7.19.6.5  The snprintf function

       Synopsis

       [#1]

               #include <stdio.h>
               int snprintf(char * restrict s, size_t n,
                       const char * restrict format, ...);

       Description

       [#2]  The snprintf function is equivalent to fprintf, except
       that the output is  written  into  an  array  (specified  by
       argument  s) rather than to a stream.  If n is zero, nothing
       is written, and s may be a null pointer.  Otherwise,  output
       characters  beyond the n-1st are discarded rather than being
       written to the array, and a null character is written at the
       end  of  the characters actually written into the array.  If
       copying  takes  place  between  objects  that  overlap,  the
       behavior is undefined.

       Returns

       [#3]  The snprintf function returns the number of characters
       that would have been written had n been sufficiently  large,
       not  counting  the terminating null character, or a negative
       value if  an  encoding  error  occurred.   Thus,  the  null-
       terminated output has been completely written if and only if
       the returned value is nonnegative and less than n.

Например:

len = snprintf(NULL, 0, "%s\n", some_string);
if (len > 0) {
    newstring = malloc(len + 1);
    if (newstring) {
        snprintf(newstring, len + 1, "%s\n", some_string);
    }
}
6 голосов
/ 17 марта 2011

Использование может использовать snprintf () с размером 0, чтобы точно определить, сколько байтов потребуется.Цена заключается в том, что строка фактически отформатирована дважды.

2 голосов
/ 17 марта 2011

В большинстве случаев вы можете вычислить его, добавив длину объединяемой строки и указав максимальную длину для числовых значений в зависимости от используемого вами формата.

2 голосов
/ 17 марта 2011

Для этого вы можете использовать snprintf, как в

sz = snprintf (NULL, 0, fmt, arg0, arg1, ...);

Но посмотрите заметки о переносимости Autoconf на snprintf.

...