每个字符串参数的长度
Length of each string argument
最近我开始接触 stdarg.h
函数,因为我想要类似于 printf
的东西,但我不想写到控制台,而是想 return 它作为一个字符串。
这是我到目前为止的想法:
char *write(const char *format, ...)
{
// init
va_list arg;
char *string;
va_start (arg, format);
vsprintf (string, format, arg);
// done
va_end (arg);
return string;
}
现在的问题是,string
没有预留内存,这就是我需要帮助解决此功能的地方,因为我还没有找到任何解决方案。
提前致谢
使用snprintf(NULL, 0
检查您需要多长时间的缓冲区。然后分配内存。然后打印到字符串。
char *my_write(const char *format, ...) {
va_list va;
va_start(va, format);
// remember to have a separate va_list for each v*print function
va_list va2;
va_copy(va2, va);
const int len = vsnprintf(NULL, 0, format, va2);
va_end(va2);
char *string = malloc((len + 1) * sizeof(*string));
if (string != NULL) {
vsprintf(string, format, va);
}
va_end(va);
return string;
}
正如@IanAbbott 在评论中所建议的,您可以调用 va_start
两次,这似乎很好地简化了代码:
char *my_write(const char *format, ...) {
va_list va;
va_start(va, format);
const int len = vsnprintf(NULL, 0, format, va);
va_end(va);
char *string = malloc((len + 1) * sizeof(*string));
if (string == NULL) {
return NULL;
}
va_start(va, format);
vsprintf(string, format, va);
va_end(va);
return string;
}
在带有 glibc 的平台上,您也可以使用 vasprintf
。请注意 write
已被 posix write() function 使用,我建议使用其他名称。使用 vasprintf
GNU 扩展,它变成了:
#define _GNU_SOURCE
#include <stdio.h>
char *write2(const char *format, ...) {
va_list va;
va_start(va, format);
char *string;
const int err = vasprintf(&string, format, va);
va_end(va);
if (err == -1) {
return NULL;
}
return string;
}
最近我开始接触 stdarg.h
函数,因为我想要类似于 printf
的东西,但我不想写到控制台,而是想 return 它作为一个字符串。
这是我到目前为止的想法:
char *write(const char *format, ...)
{
// init
va_list arg;
char *string;
va_start (arg, format);
vsprintf (string, format, arg);
// done
va_end (arg);
return string;
}
现在的问题是,string
没有预留内存,这就是我需要帮助解决此功能的地方,因为我还没有找到任何解决方案。
提前致谢
使用snprintf(NULL, 0
检查您需要多长时间的缓冲区。然后分配内存。然后打印到字符串。
char *my_write(const char *format, ...) {
va_list va;
va_start(va, format);
// remember to have a separate va_list for each v*print function
va_list va2;
va_copy(va2, va);
const int len = vsnprintf(NULL, 0, format, va2);
va_end(va2);
char *string = malloc((len + 1) * sizeof(*string));
if (string != NULL) {
vsprintf(string, format, va);
}
va_end(va);
return string;
}
正如@IanAbbott 在评论中所建议的,您可以调用 va_start
两次,这似乎很好地简化了代码:
char *my_write(const char *format, ...) {
va_list va;
va_start(va, format);
const int len = vsnprintf(NULL, 0, format, va);
va_end(va);
char *string = malloc((len + 1) * sizeof(*string));
if (string == NULL) {
return NULL;
}
va_start(va, format);
vsprintf(string, format, va);
va_end(va);
return string;
}
在带有 glibc 的平台上,您也可以使用 vasprintf
。请注意 write
已被 posix write() function 使用,我建议使用其他名称。使用 vasprintf
GNU 扩展,它变成了:
#define _GNU_SOURCE
#include <stdio.h>
char *write2(const char *format, ...) {
va_list va;
va_start(va, format);
char *string;
const int err = vasprintf(&string, format, va);
va_end(va);
if (err == -1) {
return NULL;
}
return string;
}