Ответ 1
Используйте vprintf()
.
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
Собственно, я получаю вывод мусора. Что не так в этом коде?
Используйте vprintf()
.
Вместо 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;
}
Как уже указывали другие: в этом случае вместо этого следует использовать 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
- макс. общий размер аргументов в байтах. Убедитесь, что вы используете значение, которое достаточно велико.
Это не то, как вы используете printf()
. Если вы хотите использовать va_lists
, используйте vprintf()
. Посмотрите здесь для справки.