मैंने @Valentin Milea के कोड की कोशिश की, लेकिन मुझे एक्सेस उल्लंघन की त्रुटियाँ मिली हैं। केवल एक चीज जो मेरे लिए काम कर रही थी वह थी इंसाइडिंग कोडिंग का कार्यान्वयन: http://asprintf.insanecoding.org/
विशेष रूप से, मैं VC ++ 2008 की विरासत कोड के साथ काम कर रहा था। इन्सेन कोडिंग के कार्यान्वयन से (ऊपर लिंक से डाउनलोड किया जा सकता है), मैं तीन फ़ाइलों का उपयोग: asprintf.c
, asprintf.h
और vasprintf-msvc.c
। अन्य फाइलें MSVC के अन्य संस्करणों के लिए थीं।
[संपादित करें] पूर्णता के लिए, उनकी सामग्री इस प्रकार है:
asprintf.h:
#ifndef INSANE_ASPRINTF_H
#define INSANE_ASPRINTF_H
#ifndef __cplusplus
#include <stdarg.h>
#else
#include <cstdarg>
extern "C"
{
#endif
#define insane_free(ptr) { free(ptr); ptr = 0; }
int vasprintf(char **strp, const char *fmt, va_list ap);
int asprintf(char **strp, const char *fmt, ...);
#ifdef __cplusplus
}
#endif
#endif
asprintf.c:
#include "asprintf.h"
int asprintf(char **strp, const char *fmt, ...)
{
int r;
va_list ap;
va_start(ap, fmt);
r = vasprintf(strp, fmt, ap);
va_end(ap);
return(r);
}
vasprintf-msvc.c:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include "asprintf.h"
int vasprintf(char **strp, const char *fmt, va_list ap)
{
int r = -1, size = _vscprintf(fmt, ap);
if ((size >= 0) && (size < INT_MAX))
{
*strp = (char *)malloc(size+1); //+1 for null
if (*strp)
{
r = vsnprintf(*strp, size+1, fmt, ap); //+1 for null
if ((r < 0) || (r > size))
{
insane_free(*strp);
r = -1;
}
}
}
else { *strp = 0; }
return(r);
}
उपयोग ( test.c
पागल कोडन द्वारा प्रदान किया गया हिस्सा ):
#include <stdio.h>
#include <stdlib.h>
#include "asprintf.h"
int main()
{
char *s;
if (asprintf(&s, "Hello, %d in hex padded to 8 digits is: %08x\n", 15, 15) != -1)
{
puts(s);
insane_free(s);
}
}