2015-11-13 32 views
0

我正在学习cd中的stdarg.h,我试图打印所有传递给函数的参数,但不知道有多少个参数,但是我还没有想出解决方案,在这发生过程中,无论发生什么我传递给strtest。 它总是打印0. 1. 2. 3.va_arg总是运行4次

void strtest(char *fmt, ...){ 
    va_list argp; 
    int i = 0; 

    va_start(argp, fmt); 

    while(va_arg(argp, char*)) 
     printf("%d\t", i++); 

    va_end(argp); 
} 

int main(int argc, char *argv[]){ 
    strtest("s"); 
    printf("\n"); 
    return 0; 
} 

回答

0

以下是显示传递未知数量参数的一种方法的示例。

#include <stdio.h> 
#include <stdarg.h> 

void print (char *first, ...) 
{ 
    va_list argptr; 
    char *next; 
    va_start (argptr, first); 
    next = first; 
    while (next) { 
     printf ("%s\n", next); 
     next = va_arg(argptr, char*); 
     } 
    va_end (argptr); 
} 

int main(void) 
{ 
    print("hello","world", NULL);  // NULL as sentinel 
    return 0; 
} 

程序输出

hello 
world 

也许你能适应这种使用int参数您的需求。

5

有没有标准的机制,将告诉你传递给一个可变参数函数的参数数量。像printf()这样的函数可以工作,因为它们可以通过检查格式字符串来确定参数的数量。

+0

看到这个http://stackoverflow.com/questions/1688942/variable-arguments-in-c-how-to-get-values-with-a-generic-type的方式来做到这一点。我不确定这是否符合标准,但取决于环境使得OP能够工作。 – JJF

+0

@JJF这个问题是关于参数类型,而不是参数的数量。那里有一个特定的答案,告诉你如何获得计数? – Barmar

+0

查看带有va_start(ap,count)的部分; for(i = 0; i JJF

1

这是在ISO的STDARG.H的定义9899 WG14 n1256

<STDARG.H>声明一个类型和定义了四个宏,用于通过其数量和参数列表前进 头类型对于被调用函数 翻译时不知道

您必须将参数的数目以及可能的类型传递给调用者。这不一定要通过直接传递参数的数量来完成,还有其他方法,例如printf中使用的方法。

+1

或者包含'NULL'哨兵。 –

+0

或者解析一些类似于格式字符串的函数(不需要是格式字符串) –

+0

@WeatherVane只有所有参数都是相同类型的指针时,“NULL”标记才有效。 – Barmar

0

你可以通过一个定点的功能,这样

strtest("s", (char*)0); 

使得函数可以看到,它在参数列表的末尾。

0

如果你看一下stdarg头文件的手册页,在va_arg包括本文

如果没有一个参数,或者如果类型不是与 类型的实际下一个参数兼容(根据推广到 默认参数促销),会发生随机错误。

除非你用NULL作为最后一个参数调用strtest,否则va_arg会一直持续阅读,直到它达到使其停止的东西。想想你现在正在做什么等同于读取超出范围的数组。

我很惊讶它运行了4次,不管是什么。我会希望计数等于你传给strtest的参数的数量加2或更多。