C,处理变量参数函数

假设我想做这样的事情

void my_printf(char *fmt,...) { char buf[big enough]; sprintf(buf,fmt,...); } 

将可变数量的参数直接传递给具有接受变量参数的函数的正确方法是什么?

sprintf有一个名为vsprintfva_list表单。 将您在本地构造的va_list作为最后一个参数传递给它。

 void my_printf(char *fmt,...) { va_list ap; va_start(ap, fmt); char buf[big enough]; vsprintf(buf,fmt,ap); va_end(ap); } 

我不确定这个代码有多么有用,因为它是C ++,但它显示了如何使用Win32特定函数vsnprintf()检查分配的缓冲区是否足够大,如果不分配更大的代码。 它返回一个std :: string,所以你必须使用malloc / realloc来处理它。 但到底是什么:

 string Format( const char * fmt, ... ) { const int BUFSIZE = 1024; int size = BUFSIZE, rv = -1; vector  buf( size ); do { va_list valist; va_start(valist, fmt ); // if vsnprintf() returns < 0, the buffer wasn't big enough // so increase buffer size and try again rv = _vsnprintf( &buf[0], size, fmt, valist ); va_end( valist ); size *= 2; buf.resize( size ); } while( rv < 0 ); return string( &buf[0] ); } 

您可以使用vsprintf样式函数为您的可变长度参数获取printf样式打印。 但是没有要求这样做。 如果您选择编写函数以继续接受参数,直到遇到空指针,则可以。

  va_list ap; char *param; va_start(ap,fmt); param = va_arg(ap,char*); while(param) { do something... param = va_arg(ap,char*); } 

或者您可以将参数数量作为函数的第一个参数

 void my_printf(int param_num,...) { va_list ap; char *param; va_start(ap,fmt); while(param_num) { do something... param = va_arg(ap,char*); param_num--; } } 

它真的取决于你,可能性是无限的。 我认为省略号的唯一真正要求是它在省略号之前至少有一个参数。