Reputation: 8694
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 )?
Upvotes: 2
Views: 3312
Reputation: 108938
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);
}
}
Upvotes: 9
Reputation: 6387
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.
Upvotes: 2
Reputation: 2331
You can use snprintf
for that, as in
sz = snprintf (NULL, 0, fmt, arg0, arg1, ...);
But see Autoconf's portability notes on snprintf
.
Upvotes: 2
Reputation: 19965
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.
Upvotes: 6