按照你现在给出的代码,
专注于为中小企业提供成都网站设计、网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业江阳免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
print2(3, 100, 1, 2, 3);
输出的是1 2 3加上一位不确定值
因为va_start(vl, n);这一步理论上可以得到以a开头的va_list指针,但实际上由于编译器优化,它的效果和va_start(vl, a);是相同的
这一点,你可以打印出指针地址来确定一下
从你的代码推测,你是想让print2打印出后四个参数,包括a在内
即 100 1 2 3
如果是这样 可以用另一种方式做到
print2中,不要调用va_start
而是直接 vl=a;
如下
void print2(int n, int a, ...)
{
va_list vl;
// va_start(vl, n);//使用倒数第二个有名变量
vl = a;//编译器想优化 不让。 直接强势插入
vprint(n+1, vl);
va_end(vl);
}
可以试一下是否是你需要的效果。 如果不是 再追问
C语言中可变参函数实现,主要通过VA_LIST宏及相关操作的几个宏。
一、涉及宏及说明:
所有相关宏均定义在stdarg.h中。
1、va_list: 可变参数列表指针。
2、va_start:获取可变参数列表的第一个参数的地址。
3、va_arg:获取可变参数的当前参数,返回指定类型并将指针指向下一参数。
4、va_end:清空va_list可变参数列表。
可变参函数的实现,就是这四个宏的使用。
二、代码举例:
在实际应用中,经常有获取若干个数最大值的情况,当数量比较大的时候,一般通过数组实现,但个数不多时,一般写一个max函数。 常规写法都是用到几个数的max,就写几个参数, 对此可以实现一个可变参数函数,第一个参数指定共计有多少数据,后续各个参数为要比较的值。
#include stdio.h
#include stdarg.h
int max(int n, ...)//可变参数函数。
{
int r,i;
va_list ap;//定义可变参数。
if(n == 0) return -1;//异常参数。
va_start(ap, n);//得到起始点。
for(i = 0; i n; i ++)
{
int v=va_arg(ap,int) ;//获取下一个参数值。
if(i == 0) r=v;
else if(rv) r=v;
}
va_end(ap);//结束可变参数。
return r;//返回结果。
}
可以用如下主函数测试:
int main()
{
printf("%d\n",max(1, 1));
printf("%d\n",max(2, 2,1));
printf("%d\n",max(3, 5,9, 4));
printf("%d\n",max(4, 8 , 3,1,9));
return 0;
}
分别测试了1,2,3,4个数值,求取最大值的情况。
测试结果:
1
2
9
9
sub1("6",func);这行怎么弄float也没弄出来,其它感觉都不是很难。
#include stdio.h
typedef struct {
short s[3];
} sa3;
void sub1(char *fmt,...)
{
char *ap;
int i;
void (*p)(void)=NULL;
ap = (char *)fmt + 4;
while(*fmt){
switch(*fmt++){
case '0':
printf("int: %d\n",*(int*)ap);
ap += 4;
break;
case '1':
printf("char *: %s\n",*(char**)ap);
ap += 4;
break;
case '2':
printf("double: %f\n",*(double*)ap);
ap += 8;
break;
case '3':
printf("long: %d\n", *(int*)ap);
ap += 4;
break;
case '4':
i = *(int*)ap 0xffff;
printf("short: %d\n", i);
ap += 2;
break;
case '5':
break;
case '6':
// 函数实行
break;
case '7':
for (i = 0; i 3; i++)
printf("buf[%d]: %d\n", i, *(*(short**)ap + i));
break;
case '8':
for (i = 0; i 3; i++)
printf("sa3.[%d]: %d\n", i, (*(sa3*)ap).s[i]);
break;
default:
printf("unkown fmt: %c\n",fmt[-1]);
return;
}
}
}
void func(void)
{
printf("func output.\n");
}
int main(int argc, char** argv)
{
int i = 100;
long l = 80000;
short s = 333;
float f = (float)2.33;
double d = 1.234;
short buf[3];
sa3 sa3data;
buf[0] = 11;
buf[1] = 22;
buf[2] = 33;
sa3data.s[0] = 44;
sa3data.s[1] = 55;
sa3data.s[2] = 66;
sub1("012345",i,"abc",d,l,s,f);
sub1("6",func);
sub1("7",buf);
sub1("8",sa3data);
}