Подтвердить что ты не робот

Вызов printf с помощью va_list

void TestPrint(char* format, ...)
{
    va_list argList;

    va_start(argList, format);
    printf(format, argList);
    va_end(argList);
}


int main()
{
    TestPrint("Test print %s %d\n", "string", 55);
    return 0;
}

Я хочу получить:

Test print string 55

Собственно, я получаю вывод мусора. Что не так в этом коде?

4b9b3361

Ответ 1

Используйте vprintf().

Ответ 2

Вместо printf я рекомендую вам вместо этого попробовать vprintf, который был создан для этой конкретной цели:

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

void errmsg( const char* format, ... )
{
  va_list arglist;

  printf( "Error: " );
  va_start( arglist, format );
  vprintf( format, arglist );
  va_end( arglist );
}

int main( void )
{
  errmsg( "%s %d %s", "Failed", 100, "times" );
  return EXIT_SUCCESS;
}

Источник: http://www.qnx.com/developers/docs/6.5.0/index.jsp?topic=/com.qnx.doc.neutrino_lib_ref/v/vprintf.html

Ответ 3

Как уже указывали другие: в этом случае вместо этого следует использовать vprintf.

Но если вы действительно хотите обернуть printf или хотите обернуть функцию, которая не имеет версии v..., вы можете сделать это в GCC с помощью нестандартной функции __builtin_apply:

int myfunction(char *fmt, ...)
{
    void *arg = __builtin_apply_args();
    void *ret = __builtin_apply((void*)printf, arg, 100);
    __builtin_return(ret);
}

Последний аргумент __builtin_apply - макс. общий размер аргументов в байтах. Убедитесь, что вы используете значение, которое достаточно велико.

Ответ 4

Это не то, как вы используете printf(). Если вы хотите использовать va_lists, используйте vprintf(). Посмотрите здесь для справки.