sprintf() with automatic memory allocation?

c, malloc, printf

Solution

Here is the original answer from Stack Overflow. As others have mentioned, you need `snprintf` not `sprintf`. Make sure the second argument to `snprintf` is `zero`. That will prevent `snprintf` from writing to the `NULL` string that is the first argument.

The second argument is needed because it tells `snprintf` that enough space is not available to write to the output buffer. When enough space is not available `snprintf` returns the number of bytes it would have written, had enough space been available.

Reproducing the code from that link here ...

char* get_error_message(char const *msg) {
    size_t needed = snprintf(NULL, 0, "%s: %s (%d)", msg, strerror(errno), errno) + 1;
    char  *buffer = malloc(needed);
    sprintf(buffer, "%s: %s (%d)", msg, strerror(errno), errno);
    return buffer;
}

Problem

I'm searching for a `sprintf()`-like implementation of a function that automatically allocates required memory. So I want to say ``` char *my_str = dynamic_sprintf("Hello %s, this is a %.*s nice %05d string", a, b, c, d); ``` and `my_str` receives the address of an allocated block of memory that holds the result of this `sprintf()`. In another forum, I read that this can be solved like this: ``` #include <stdlib.h> #include <stdio.h> #include <string.h> int main() { char *ret; char *a = "Hello"; char *b = "World"; int c = 123; int numbytes; numbytes = sprintf((char *)NULL, "%s %d %s!", a, c, b); printf("numbytes = %d", numbytes); ret = (char *)malloc((numbytes + 1) * sizeof(char)); sprintf(ret, "%s %d %s!", a, c, b); printf("ret = >%s<\n", ret); free(ret); return 0; } ``` But this immediately results in a segfault when the `sprintf()` with the null pointer is invoked. So any idea, solution or tips? A small implementation of a `sprintf()`-like parser that is placed in the public domain would already be enough, then I could get it myself done. Thanks a lot!

Original source

Related problems