c语言函数不定类型参数 c语言如何确定参数类型

C语言 麻烦帮写个不定参数函数的程序

#include "stdarg.h"

创新互联公司专注于企业成都全网营销、网站重做改版、澄城网站定制设计、自适应品牌网站建设、H5场景定制商城网站制作、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为澄城等各大城市提供网站开发制作服务。

//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;

}

如何定义不定参数函数

不定参数个数 传递时要指明其参数类型

还有文件包含库 你也没包含进来~

#include stdarg.h //函数可变参数宏包含在此文件中(属于C语言的标准库)

给你一个例子:

/*

功能名称: aveage 通过可变参数宏来完成N个数的平均值计算

入口参数: ParaNum 参数个数 , ... 可能的参数

出口参数: 平均值float

备注名称:

日期版本:

*/

float average(int ParaNum,...);

float average(int ParaNum,...)

{

va_list va_Average;

int count;

long sum;

va_start(va_Average,ParaNum);//va_start 第二个参数为... 的前一个参数

for(count = 1;countParaNum;count++)

{

sum += (long)(va_arg(va_Average,int));

}

va_end(va_Average);

return (float)(sum/ParaNum);

}

不定参数传递的时候,是有标准库的。

C语言怎么实现函数不定参数

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语言中如何向同一函数传不同类型的形参?

c语言没有重载,c++有。

可以使用字符串传递原值和目标值,增加类型定义参数。

int template(char *dst, char *src,int type)

{

int i_aa=0;

double d_bb=0.0L;

switch(type){

case 0: //整型

i_aa = atof(src);

i_aa = i_aa * 10;

sprintf(dst,"%d",i_aa);

break;

case 1: //浮点型

d_bb = atof(src);

d_bb = d_bb - 0.05;

sprintf(dst,"%.2lf",d_bb);

break;

case 2: //字符串

sprintf(dst,"this is %s",src);

break;

default:

return src;

}

return dst;

}

函数外再处理dst了。注意长度定义。

c语言中的printf()这样的有不定个参数的函数是如何实现的

首先先看到main函数中的不定参数:

1.引用:在Turbo C2.0启动过程中, 传递main()函数三个参数: argc, argv和env。

* argc: 整数, 鴐ain()的命令行参数个数。

* argv: 字符串数组。

argv[0] 为程序运行的全路径名

argv[1] 为在DOS命令行中执行程序名后的第一个字符串;

argv[2] 为执行程序名后的第二个字符串;

...

argv[argc]为NULL。

*env: 字符串数组。env[] 的每一个元素都包含ENVVAR=value形式的字符

串。其中ENVVAR为环境变量。value 为ENVVAR的对应值

#include stdlib.h

#include stdio.h

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

{

int i;

printf("%d\n", argc); /* 为什么它的输出是 1, 它到底是定义什么的,我看不明上面的解释*/

for(i=0; i=argc; i++)

printf("argv[%d]:%s\n", i, argv[i]);

for(i=0; env[i]!=NULL; i++)

printf(" env[%d]:%s\n", i, env[i]);

}

argc, argv, env是在main()函数之前被赋值的,编译器生成的可执行文件,main()不是真正的入口点,而是一个标准的函数,这个函数名与具体的操作系统有关。

就想到其他函数是否能实现一样的功能,查询了相关资料,基本上都是利用STDARG.H中的

#define va_start(ap, parmN) (ap = ...)

#define va_arg(ap, type) (*((type *)(ap))++)

#define va_end(ap)

定义如下:

typedef char * va_list;

#define va_start _crt_va_start

#define va_arg _crt_va_arg

#define va_end _crt_va_end

#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )

#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

#define _crt_va_end(ap) ( ap = (va_list)0 )

修改他人程序如下:

void average(int first,...)

{int i=first;

va_list maker;

va_start(maker,first);

while(i!=-1){ printf("%p: %d\n",maker,i);

i=va_arg(maker,int);

}

}

void main(void)

{

average(2,3,4,4,-1);

}

运行结果:

FFCE: 2

FFD0: 3

FFD2: 4

FFD4: 4

这个程序显示函数参数的地址相差2个字节

所以可以改写为:

void x(char *n,...)

{int *p;

p=n;

while(*p!=-1)

{printf("%p:%s\n",p,*p,*p);

p+=sizeof(char);}}

void main()

{x("g","hfd","gfg","vsds",-1);}

运行结果:

FFD2:g

FFD4:hfd

FFD6:gfg

FFD8:vsds

不必通过宏va_start,va_arg,va_end实现

C语言,不定参数的函数指针问题

很巧我现在正好也有实现这样函数的需求,其实就是看了C语言可变参数函数的相关资料,你就差不多知道怎么实现了。

只不过其中有一个很重要的大坑,只要迈过去就没问题。我是试了半天才明白的:

如果参数是char或float类型,这样的参数放在可变参数部分的话,编译器是会默认把它们的类型提升为相应的“全”类型的:char提升为int,float提升为double。如果你没注意这一点就会出现错误。当然可以通过指针的类型转换来避免。

先简略地点一下,等我在CSDN博客里详细地写一写心得吧。虽然是N年前的问题估计楼主早就自己解决了,但希望能帮到其他人:)


分享名称:c语言函数不定类型参数 c语言如何确定参数类型
URL地址:http://myzitong.com/article/hhosec.html