是否有一个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;
}

那它的对应物呢?

最佳答案

我就是这样做的:

// .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 - 使用va_list格式化C字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32441897/

10-11 21:32