it-swarm.com.ru

вызовите 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

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

44
Alex F

Вместо этого используйте vprintf() .

71
Oliver Charlesworth

Вместо 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

56
onteria_

Как уже отмечали другие: в этом случае вы должны использовать 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 - это макс. общий размер аргументов в байтах. Убедитесь, что вы используете здесь достаточно большое значение.

23
CliffordVienna

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

5
Constantinius