Чтобы использовать переменные списки аргументов в C, вам нужно использовать несколько макросов, определенных в заголовочном файле stdarg.h, который поставляется вместе с вашим компилятором.
вот подробное объяснение того, как написать свой собственный printf
Если вы просто хотите передать аргументы реальному printf без дальнейших манипуляций, вы можете вместо этого использовать вариант printf vfprintf, но вам нужно отдельно расширить параметр fmt:
static void echo(NSString *fmt, ...)
{
va_list args;
NSString *logfmt = [NSString stringWithFormat: @"<<<<<<<%s>>>>>>>", [fmt UTF8String]];
va_start (args, fmt);
vfprintf( stdout, [logfmt UTF8String], args );
va_end (args);
[logfmt release];
}