彤姐的程序篇(四)关于支持可变参数的函数.
2016-11-09 10:27
267 查看
对于可变参数函数(需要加头文件为:#include<stdarg.h>)刚刚接触到这个概念的我也是一脸懵逼,完全不知道怎么搞,在翻阅过大量的资料和经过一系列的摸爬滚打之后,我写出了以下几个程序,都是关于怎么使用可变参数函数的,希望对刚刚学习c的小伙伴们一丢丢帮助。
废话少说,扔程序先偷笑。
程序一:(用可变参数求平均值)
#include<stdio.h>
#include<stdarg.h> //可变函数必须要引入的头文件
int average(int n,...) //只需要引入传入数据的个数,后边的具体数据用"..."代替
{
int i=0;
int sum=0;
va_list arg;//强制类型转化char* arg
va_start(arg,n);//初始化,指向n前(下文有注释1)的第一个参数,即(1,2,3,4,5)中的1。
for(i=0; i<n; i++)
{
sum+=va_arg(arg,int);//每次获取一个变量,执行一次,往前移动一次。
}
va_end(arg);//结束可变参数函数的使用
return sum/n;
}
int main()
{
int i=average(5,1,2,3,4,5);
printf("%d",i);
system("pause");
return 0;
}
程序二:(用可变参数求最大值)
#include<stdio.h>
#include<stdarg.h>
int MAX(int n,...)
{
int i=0;
int max=0;
int t=0;
va_list arg;
va_start(arg,n);
max=va_arg(arg,int);//将(1,2,3,4,7)中的1赋给max
for(i=0; i<n-1; i++)
{
t=va_arg(arg,int);//将(1,2,3,4,7)中的2赋给t,因为va_arg(arg,int)每执行一次,往前移动一个变量
if(max<t)
{
max=t;
}
}
va_end(arg);
return max;
}
int main()
{
int gat;
gat=MAX(5,1,2,3,4,7);
printf("%d",gat);
system("pause");
return 0;
}
程序三:(用可变参数实现printf函数)
#include<stdio.h>
#include<stdarg.h>
void my_printf(char *arr,...)
{
va_list arg;
va_start(arg,arr);
while(*arr)
{
if(*arr=='s')
{
puts(va_arg(arg,char*));//碰到's'则输出字符串
}
if(*arr=='c')
{
putchar(va_arg(arg,char));//碰到'c'则输出一个字符
}
arr++;
}
va_end(arg);
}
int main()
{
my_printf("s ccc","hello",'b','i','t');
system("pause");
return 0;
}
注释1:上文所说的n前而非n后是因为括号中的数字在栈中存储是由高地址向低地址存储的。如下图所示
以上是我对可变参数函数的一点浅识,我用自己的话总结了各个语句背后所代表的实质含义,勿喷勿喷
。
废话少说,扔程序先偷笑。
程序一:(用可变参数求平均值)
#include<stdio.h>
#include<stdarg.h> //可变函数必须要引入的头文件
int average(int n,...) //只需要引入传入数据的个数,后边的具体数据用"..."代替
{
int i=0;
int sum=0;
va_list arg;//强制类型转化char* arg
va_start(arg,n);//初始化,指向n前(下文有注释1)的第一个参数,即(1,2,3,4,5)中的1。
for(i=0; i<n; i++)
{
sum+=va_arg(arg,int);//每次获取一个变量,执行一次,往前移动一次。
}
va_end(arg);//结束可变参数函数的使用
return sum/n;
}
int main()
{
int i=average(5,1,2,3,4,5);
printf("%d",i);
system("pause");
return 0;
}
程序二:(用可变参数求最大值)
#include<stdio.h>
#include<stdarg.h>
int MAX(int n,...)
{
int i=0;
int max=0;
int t=0;
va_list arg;
va_start(arg,n);
max=va_arg(arg,int);//将(1,2,3,4,7)中的1赋给max
for(i=0; i<n-1; i++)
{
t=va_arg(arg,int);//将(1,2,3,4,7)中的2赋给t,因为va_arg(arg,int)每执行一次,往前移动一个变量
if(max<t)
{
max=t;
}
}
va_end(arg);
return max;
}
int main()
{
int gat;
gat=MAX(5,1,2,3,4,7);
printf("%d",gat);
system("pause");
return 0;
}
程序三:(用可变参数实现printf函数)
#include<stdio.h>
#include<stdarg.h>
void my_printf(char *arr,...)
{
va_list arg;
va_start(arg,arr);
while(*arr)
{
if(*arr=='s')
{
puts(va_arg(arg,char*));//碰到's'则输出字符串
}
if(*arr=='c')
{
putchar(va_arg(arg,char));//碰到'c'则输出一个字符
}
arr++;
}
va_end(arg);
}
int main()
{
my_printf("s ccc","hello",'b','i','t');
system("pause");
return 0;
}
注释1:上文所说的n前而非n后是因为括号中的数字在栈中存储是由高地址向低地址存储的。如下图所示
以上是我对可变参数函数的一点浅识,我用自己的话总结了各个语句背后所代表的实质含义,勿喷勿喷
。
相关文章推荐
- 关于C中函数的可变参数va_list...
- 关于C中函数的可变参数va_list...(转)
- 关于可变参数的函数
- c/c++支持可变参数的函数
- c/c++支持可变参数的函数
- c/c++支持可变参数的函数
- Thin的DateChooser代码学习(关于js的函数参数为一个完整的函数以及“对象不支持此属性或方法”错误的解决)(原创,转载请声明)
- 关于C中函数的可变参数va_list...
- 关于C语言可变参数函数的一些研究和总结
- C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) .
- c/c++支持可变参数的函数
- 关于可变参数的函数定义方法 [曾经微软的面试题]
- 使用未公开关键字在 C# 中导入外部 printf 等参数数量可变函数 [1] CLR 支持
- 在C语言中编写支持可变参数的函数
- 关于C中函数的可变参数va_list...(转)
- 关于可变参数函数的若干问题(转载)
- C库中对函数的可变参数的支持
- C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例)
- C#关于静态函数与普通函数之间的调用问题,以及可变参数的使用
- C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) .