Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <stdarg.h>
- __attribute__((format(printf, 1, 0)))
- static char* strdup_printf(const char* fmt, va_list ap)
- {
- char* str = NULL;
- int required_size = 0;
- va_list ap_copy;
- // find out required size
- va_copy(ap_copy, ap);
- required_size = vsnprintf(NULL, 0, fmt, ap) + 1; // add 1 for \0
- va_end(ap);
- if (required_size > 0)
- str = (char*)malloc((size_t)required_size);
- // write to str
- if (str != NULL)
- {
- va_copy(ap_copy, ap);
- vsnprintf(str, (size_t)required_size, fmt, ap);
- va_end(ap);
- }
- return str;
- }
- __attribute__((format(printf, 1, 2)))
- char* w_strdup_printf(const char* fmt, ...)
- {
- va_list ap;
- char* msg;
- va_start(ap, fmt);
- msg = strdup_printf(fmt, ap);
- va_end(ap);
- return msg;
- }
- int main()
- {
- //printf("=== FIRST\n");
- char* a = w_strdup_printf("generror %s %d", "abcd", 70);
- printf("a %p\n", a);
- free(a);
- //printf("=== SECOND\n");
- char* b = w_strdup_printf("generro %s %d", "zabcd", 70);
- printf("b %p\n", b);
- free(b);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment