❶ c语言 怎么写 可变 参数函数
#include<stdarg.h>//可变参数函数必要的头文件
#include<stdio.h>
longintsum(unsignedintargc,...)//可变参数函数必须包含至少一个确定的参数
{
longintsrt=0;
intva;
unsignedinti;
va_listvl;//用于指向可变参数列表
va_start(vl,argc);//初始化,va_start()调用的第一个参数是所编写的可变参数函数的最后一个确定的参数
for(i=0;i<argc;i++){
srt+=(int)va_arg(vl,int);//从参数列表按提取一个int类型的值参与相加运算
}
va_end(vl);//清理
returnsrt;
}
intmain(intargc,char*argv[])
{
printf("%ld ",sum(3,1,2,3));
return0;
}
❷ C语言中如何实现可变参函数
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>
intmax(intn,...)//可变参数函数。
{
intr,i;
va_listap;//定义可变参数。
if(n==0)return-1;//异常参数。
va_start(ap,n);//得到起始点。
for(i=0;i<n;i++)
{
intv=va_arg(ap,int);//获取下一个参数值。
if(i==0)r=v;
elseif(r<v)r=v;
}
va_end(ap);//结束可变参数。
returnr;//返回结果。
}
可以用如下主函数测试:
intmain()
{
printf("%d ",max(1,1));
printf("%d ",max(2,2,1));
printf("%d ",max(3,5,9,4));
printf("%d ",max(4,8,3,1,9));
return0;
}
分别测试了1,2,3,4个数值,求取最大值的情况。
测试结果:
1
2
9
9
❸ 如何在C语言中实现可变长度的参数
C语言实现可变长度字符串,主要依靠realloc函数实现,主要代码如下,
//程序功能,判断插入字符长度len,若大于预设大小n,调整字符串数组大小,实现动态处理数组大小。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char * pstr = NULL;
int n=10;//字符串初始大小
char str[100];//待插入字符串
int len=0;//待插入字符串长度
pstr = (char*)malloc(sizeof(char)*n);//申请sizeof(char)*n个大小的内存空间
if (pstr==NULL)
{
printf("内存申请出错,程序退出!\n");
exit(1);
}
❹ C语言中如何获取函数可变参数的个数
这个看你是怎么调用的
一般都是约定个数 或者根据第一个参数,决定个数。
你这个写法,看起来是两个参数调用,然后都是char* 如果是这样
要改成
#include<stdio.h>
#include<stdarg.h>
voidprint(char*value,...)
{
char*t;
printf(value);
va_listval;
va_start(val,value);
t=va_arg(val,char*);//获取下一个参数需要赋值的。
printf(t);
va_end(val);
}
❺ c语言中什么是可变参数最好有简单的应用可变参数的例子。谢谢
一个简单的可变参数的函数的例子:
#include <stdio.h>
#include <stdarg.h>
void Func(int count, ...) //可变形参的函数的定义
{
va_list ap;
int n = count; //使用count来表示后面的参数个数
char *s = NULL;
int d = 0;
double f = 0.0;
va_start(ap, count); // 从第二个形参开始读取
s = va_arg(ap, char*); //为形参指定类型char*
d = va_arg(ap, int); //为形参指定类型int
f = va_arg(ap, double); //为形参指定类型double
va_end(ap); //读取形参结束
printf( "%s %d %f ", s, d, f); //这里可以做想要的功能了。
}
main()
{
Func(3, "Hello", 345, 788.234);
}
❻ C语言 可变参数列表
虽然我对可变参数表不太懂,但是我可以看得出你的/* */那段显然有问题,你for循环4遍,但你获取可变参数值的时候你没有告诉获取第几个值,那个count肯定不仅仅是个循环变量,它在循环体中肯定还要用来提示获取第几个参数,也就是你注意一下if里的m=va_arg(var_arg,float)这个语句,肯定要用到float
❼ c语言如何定义一个可变参数函数 如何调用其输入的参数 分别
有专门的宏,处理可变参
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
一个简单的例子
voidsimple_va_fun(inti,...)
{
va_listarg_ptr;
intj=0;
va_start(arg_ptr,i);
j=va_arg(arg_ptr,int);
va_end(arg_ptr);
printf("i=%dj=%dn",i,j);
return;
}
intmain()
{
simple_va_fun(1);
simple_va_fun(1,2);
simple_va_fun(1,200);
return0;
}
❽ c语言中函数可否改变参数值
#include
void
foo(int
x,
int
y,
int
z)
{
printf("x
=
%d
at
[%x]n",
x,
&x);
printf("y
=
%d
at
[%x]n",
y,
&y);
printf("z
=
%d
at
[%x]n",
z,
&z);
}
int
main(int
argc,
char
*argv[])
{
foo(100,
200,
300);
return
0;
}
运行结果:
x
=
100
at
[bfe28760]
y
=
200
at
[bfe28764]
z
=
300
at
[bfe28768]
c程序栈底为高地址,栈顶为低地址,因此上面的实例可以说明函数参数入栈顺序的确是从右至左的。可到底为什么呢?查了一直些文献得知,参数入栈顺序是和具体编译器实现相关的。比如,pascal语言中参数就是从左到右入栈的,有些语言中还可以通过修饰符进行指定,如visual
c++.即然两种方式都可以,为什么c语言要选择从右至左呢?
进一步发现,pascal语言不支持可变长参数,而c语言支持这种特色,正是这个原因使得c语言函数参数入栈顺序为从右至左。具体原因为:c方式参数入栈顺序(从右至左)的好处就是可以动态变化参数个数。通过栈堆分析可知,自左向右的入栈方式,最前面的参数被压在栈底。除非知道参数个数,否则是无法通过栈指针的相对位移求得最左边的参数。这样就变成了左边参数的个数不确定,正好和动态参数个数的方向相反。
因此,c语言函数参数采用自右向左的入栈顺序,主要原因是为了支持可变长参数形式。换句话说,如果不支持这个特色,c语言完全和pascal一样,采用自左向右的参数入栈方式
❾ C语言可变参数传递的问题
voidfun1(inta,intb,constchar*fmt,...);
voidfun2(constchar*fmt,...);.
你注意了,参数传递的可是const类型的,不可以改变哦~
传递出来的args当然也不会有变化。
(奇怪的是你的编译器没有报错吗?晕啊……)
❿ c语言如何封装一个带有可变参数的方法
需要借用C语言的VA_LIST宏定义,及相关操作来实现可变参数。
VA_LIST所在头文件:#include <stdarg.h>,用法如下:
(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;
(2)然后用VA_START宏初始化刚定义的VA_LIST变量;
(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数);
(4)最后用VA_END宏结束可变参数的获取。
以下是一个自定义打印接口的实现:
intmy_printf(constchar*fmt,...)//...表示参数可变
{
va_listargs;//定义va_list
staticchargc_PrintfOutBuff[1000];
va_start(args,fmt);//初始化
vsnprintf((char*)gc_PrintfOutBuff,1000,(char*)fmt,args);//这里没有使用VA_ARG取回单个变量,而是借用vsnprinf一次性读取。
va_end(args);//结束获取
puts("%s",(constchar*)gc_PrintfOutBuff);//使用。
return0;
}