سؤال

Is there a function around somewhere that I can use to predict the space that sprintf( ) will need? IOW, can I call a function size_t predict_space( "%s\n", some_string ) that will return the length of the C-string that will result from sprintf( "%s\n", some_string )?

هل كانت مفيدة؟

المحلول

In C99 snprintf (note: Windows and SUSv2, do not provide an implementation of snprintf (or _snprintf) conforming to the Standard):

       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.

For example:

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);
    }
}

نصائح أخرى

Use can use snprintf() with a size of of 0 to find out exactly how many bytes will be required. The price is that the string is in effect formatted twice.

You can use snprintf for that, as in

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

But see Autoconf's portability notes on snprintf.

In most cases, you can compute it by adding length of the string you are concatenating and taking max length for numeric values based on the format you used.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top