具有可变数量参数的打印功能

时间:2012-11-25 17:40:58

标签: c

我有这个功能:

void print(THashEntry *entry, ...)
{
    va_list parameters;

    va_start(parameters, entry);

    while (true)
    {
        THashEntry *currentEntry = va_arg(parameters, THashEntry *);
        if (!currentEntry)
        {
            break;
        }

        printf("%s\n", currentEntry->value);
    }



 va_end(parameters);
}

我将这些条目的地址传递给函数,然后我想访问其成员“value”并打印它。

然而,当我尝试通过va_arg获取参数时,它返回的不是第一个,而是第二个参数,从开始就开始,当另一个循环循环进入时,它就是分段错误。

4 个答案:

答案 0 :(得分:2)

正如John Kugelman在his answer中所述,这里有一些将可变数量的参数传递给printf / sprintf的好方法: -

 void Error(const char* format, ...)
 {
  va_list argptr;
  va_start(argptr, format);
  vfprintf(stderr, format, argptr);
  va_end(argptr);
 }

答案 1 :(得分:0)

当你到达参数列表的末尾时,

va_arg将不会返回NULL。正如man va_arg所说:

  

将发生随机错误

因此,为了解决这个问题,您需要将多个参数传递给print函数或结束终止符。

要在编译时自动计算参数数量,可以使用宏

#define NUMARGS(...)  (sizeof((int[]){__VA_ARGS__})/sizeof(int))

this answer

中查看更多详情

答案 2 :(得分:0)

我为你的设计辩护而道歉,但这可能是使用

的替代方案
 struct abc {
    int a;
    char b[10];
 };

 void f(int size, abc* a) {
    for (int i = 0; i < size; i++) {
    abc x = a[i];
    }
 }

int _tmain(int argc, _TCHAR* argv[])
{
abc *arrAbc = new abc[10];
for (int i = 0; i < 10; i++) {
    arrAbc[i].a = 0;
}
f(10, arrAbc);
}

答案 3 :(得分:0)

似乎有很多答案,但我个人从来没有找到一个很好的方法来动态计算va_list中args的数量。

那说,有几种方法可以解决它:

  • 使用qrdl
  • 指出的NUMARGS(...)宏
  • 将args的数量传递给函数,就像main void print(int numArgs, MyEntry *entry, ...)
  • 一样
  • 使用NULL终止列表

后者恰好是我个人的偏好,因为它往往与我的(并且看起来也是你的)本能地如何抓住列表的末尾。见下文:

 #import <stdarg.h>

 typedef struct MyEntry {
     int a;
     int b;
 } MyEntry;

 void print(int numArgs, MyEntry *entry, ...) {

     va_list parameters;

     va_start(parameters, entry);

     MyEntry *m;
     for ( m = entry; m != NULL; m = va_arg(parameters, MyEntry *))  {        
         printf("%d\n", (int)m->a);
     }

     va_end(parameters);
 }

 int main(int argc, char *argv[]) {

     MyEntry entry = { 10, 20 };
     MyEntry entry2 = { 30, 40 };
     MyEntry entry3 = { 50, 60 };
     MyEntry entry4 = { 70, 80 };
     MyEntry entry5 = { 90, 100 };

     print(2, &entry, &entry2, &entry3, &entry4, &entry5, NULL);
     return 1;
 }

快乐的编码!