vsnprintf() - , , , .
Microsoft , , , , : , , %n, .
, , . . , , , undefined. , , , .
2 vsnprintf(), K, , , :
int vsprintf_s(char * restrict s, rsize_t n,
const char * restrict format,
va_list arg);
int vsnprintf_s(char * restrict s, rsize_t n,
const char * restrict format,
va_list arg);
- snprintf -:
%n.n 0.s , snprintf() n 0.vsprintf_s vsnprintf_s, , n-1: , 0 , , vsnprintf, vsnprintf_s do.
, snprintf(), :
int vasprintf(char **strp, const char *format, va_list ap) {
va_list arg;
int ret;
if (!strp) {
errno = EINVAL;
return -1;
}
va_copy(arg, ap);
ret = vsnprintf(NULL, 0, format, arg);
va_end(arg);
*strp = NULL;
if (ret < 0 || (*strp = malloc(ret + 1)) == NULL) {
return -1;
}
return vsnprintf(*strp, ret + 1, format, ap);
}
vnsprintf vsprintf_s, vsprintf_s : . vsnprintf_s , NULL, .
: vsnprintf vsnprintf_s 1 NULL, 0:
int vasprintf(char **strp, const char *format, va_list ap) {
char buf[1];
va_list arg;
int ret;
if (!strp) {
errno = EINVAL;
return -1;
}
va_copy(arg, ap);
ret = vsnprintf_s(buf, 1, format, arg);
va_end(arg);
*strp = NULL;
if (ret < 0 || (*strp = malloc(ret + 1)) == NULL) {
return -1;
}
return vsnprintf_s(*strp, ret + 1, format, ap);
}
, : Visual Studio , :
#ifdef _WIN32
#define _CRT_SECURE_NO_WARNINGS
#endif
.
, , . gcc clang -Wall , . Visual Studio /W4.