передача va_args в функцию пользовательского формата - PullRequest
1 голос
/ 08 ноября 2019

Я хотел бы использовать список va_args в пользовательской функции форматирования.

Сначала я попытался заставить vsnprintf () работать, чтобы убедиться, что мой список указателей на аргументы передан правильно => это сработало

Но когда я попытался передать свой список указателей аргументов другой функции, указатель не указывает на нужный элемент в стеке

#include <stdio.h>
#include <stdarg.h>


int wrapper_snprintf(char *s, size_t n, const char *format, ...)
{
  va_list arg;
  //Copy Formated string to buffer => adds a terminating null character to the string
  va_start(arg, format);
  int res = vsnprintf(s, n, format, arg);
  va_end(arg);

  return res;
}

void Va_Args_Test_C(char *fmt, ...)
{

  char test[30] = { 0 };
  char test2[30] = { 0 };
  {
    //vsnprintf
    va_list arg;

    va_start(arg, fmt);
    vsnprintf(test2, 30, fmt, arg);
    va_end(arg);

  }

  {
    //custom format function
      va_list arg;

      va_start(arg, fmt);
      wrapper_snprintf(test2, 30, fmt, arg);
      va_end(arg);

    }


}

, сработал первый запуск. Правильный аргумент копируется в строку test [].

, второй запуск не сработал. test2 [] содержит исходную строку + какое-то случайное число (которое мне кажется дерьмовым указателем). Так ты можешь мне помочь? Что я делаю не так?

1 Ответ

1 голос
/ 08 ноября 2019

В первом случае вы звоните vsnprintf(test2, 30, fmt, arg);. Эта функция определена как

int vsnprintf(char *str, size_t size, const char *format, va_list ap);

Во втором случае вы вызываете wrapper_snprintf(test2, 30, fmt, arg);, но ваша определяется по-другому как

int wrapper_snprintf(char *s, size_t n, const char *format, ...)

Это так, как если бы вы звонили snprintf вместоиз vsnprintf.

Если вы хотите заменить vsnprintf, вы должны определить свою функцию с аргументом типа va_list вместо ...

int wrapper_snprintf(char *s, size_t n, const char *format, va_list ap)
{
  //Copy Formated string to buffer => adds a terminating null character to the string

  int res = vsnprintf(s, n, format, ap);

  return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...