gpt4 book ai didi

c - 使用 va_list 格式化 C 字符串

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:44 26 4
gpt4 key购买 nike

是否有一个 va_list 相当于 snprintf哪个接受可变参数的 va_list?我正在尝试实现两个功能:

char * __HYP format_cstring(const char * format, ...);
chat * __HYP format_cstringv(const char * format, var_list args);

但我不确定如何将 snprintf 应用于这种情况。像这样(注意问号):

char * __HYP format_cstring(const char * format, ...)
{
int size = snprintf(NULL, 0, format, ??);
char * buffer = (char *)malloc(size * sizeof(char));

if (snprintf(buffer, size, format, ??) < 0) {

free(buffer);
return NULL;
}

return buffer;
}

它的 format_cstringv 对应物呢?

最佳答案

这是我最终的做法:

// .h
char * sformat(const char * format, ...) __attribute__((format (printf, 1, 2)));
char * vsformat(const char * format, va_list args) __attribute__((format (printf, 1, 0)));

和实现:

char * __HYP sformat(const char * format, ...)
{
char * buffer;

va_list args;
va_start(args, format);
buffer = __HYP vsformat(format, args);
va_end(args);

return buffer;
}

char * __HYP vsformat(const char * format, va_list args)
{
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-nonliteral"

int size = vsnprintf(NULL, 0, format, args);

if (size <= 0) {
return NULL;
}

char * buffer = new char[size + 1];

if (buffer == NULL) {
return NULL;
}

if (vsnprintf(buffer, static_cast<size_t>(size), format, args) <= 0) {

free(buffer);
return NULL;
}

#pragma GCC diagnostic pop

return buffer;
}

在多年未接触 C++ 之后,我发现自己对 C++ 有多健忘。

关于c - 使用 va_list 格式化 C 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32441897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com