十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
#include "stdarg.h"
创新互联公司是一家集网站建设,贵德企业网站建设,贵德品牌网站建设,网站定制,贵德网站建设报价,网络营销,网络优化,贵德网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
//n表示输入参数,总的个数,后面是各个元素的值
int va_add(int n,...)
{
va_list lst;
int i;
int t = 0;
va_start(lst,n);
for (i = 0; i n; i++)
{
int c = va_arg(lst, int);
printf("%d: %d\n", c);
t += c;
}
return t;
}
int main()
{
int t = va_add(4,1,2,3,4);
printf("Sum is:%d\n", t);
getch();
return 0;
}
VA_LIST是在C语言中解决变参问题的一组宏,所在头文件:#include stdarg.h,用于获取不确定个数的参数。
VA_LIST的用法:
首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;
然后用VA_START宏初始化刚定义的VA_LIST变量;
然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数);
最后用VA_END宏结束可变参数的获取。
以下是一个定义一个参数个数不确定的函数的简单例子:
#include cstdarg
#include iostream
using namespace std;
double average ( int num, ... )
{
va_list arguments; // A place to store the list of arguments
double sum = 0;
va_start ( arguments, num ); // Initializing arguments to store all values after num
for ( int x = 0; x num; x++ ) // Loop until all numbers are added
sum += va_arg ( arguments, double ); // Adds the next value in argument list to sum.
va_end ( arguments ); // Cleans up the list
return sum / num; // Returns some number (typecast prevents truncation)
}
int main()
{
cout average ( 3, 12.2, 22.3, 4.5 ) endl;
cout average ( 5, 3.3, 2.2, 1.1, 5.5, 3.3 ) endl;
}
C语言中定义了va_list, va_start( ), va_arg( ), va_end( ) 这样一组宏来处理可变参数问题。
可以参考printf的声明,创建自己的实现函数。示例:
#includestdio.h
#includestdarg.h
void va_fun(int start,...)
{
va_list arg_ptr;
int nArgValue = start;
int nArgCount = 1;
va_start(arg_ptr,start);
while(nArgValue != -1)
{
printf("arg %d is:%d/n",nArgCount,nArgValue);
nArgValue=va_arg(arg_ptr,int);
++nArgCount;
}
return;
}
main()
{
va_fun(5,1,7,-1);
printf("................/n");
va_fun(2,4,-1);
printf("................/n");
va_fun(-1);
printf("................/n");
//va_fun(); 可变参数函数最少要有一个参数。
}
很巧我现在正好也有实现这样函数的需求,其实就是看了C语言可变参数函数的相关资料,你就差不多知道怎么实现了。
只不过其中有一个很重要的大坑,只要迈过去就没问题。我是试了半天才明白的:
如果参数是char或float类型,这样的参数放在可变参数部分的话,编译器是会默认把它们的类型提升为相应的“全”类型的:char提升为int,float提升为double。如果你没注意这一点就会出现错误。当然可以通过指针的类型转换来避免。
先简略地点一下,等我在CSDN博客里详细地写一写心得吧。虽然是N年前的问题估计楼主早就自己解决了,但希望能帮到其他人:)