C,处理变量参数函数

时间:2010-03-10 22:16:31

标签: c variables arguments

假设我想做这样的事情

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

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

3 个答案:

答案 0 :(得分:9)

sprintf有一个名为va_list的{​​{1}}表单。将您构造的vsprintf作为最后一个参数传递给它。

va_list

答案 1 :(得分:1)

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

string Format( const char * fmt, ... ) {
    const int BUFSIZE = 1024;
    int size = BUFSIZE, rv = -1;
    vector <char> 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] );
}

答案 2 :(得分:-1)

您可以使用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--;
}

}

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