最近学C语言,发现了一个有趣的问题,printf和scanf这些函数,它的的参数都是可变的,不是固定的。那么,我也行写一个类似这样的可变参数的函数,这个要怎么写啊?最好能举例说明一下~ 求大佬现身

上传的附件
你的回答被采纳后将获得: 10点积分 (将会扣除手续费1点积分。)

keyboard_arrow_left上一篇 : 关键字volatile是干嘛的 static关键字的作用? : 下一篇keyboard_arrow_right

2个回答

Foooooooood
2019-01-08 08:53:29

我们在编写c或者c++函数的时候参数都是固定的,但其实函数的参数个数并不一定是固定的,也可以是可变的,比如常见的printf函数和scanf函数,他的参数个数就是可变的。那么要如何编写一个可变参数的函数呢?

  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. // 求参数的和,参数个数不定,其中first称为最后一个固定参数,first之后的第一个参数称为第一个可变参数
  4. int sum(int first,...)
  5. {
  6. int sum = 0,val = first;
  7. va_list vList;
  8. va_start(vList,first);
  9. while(val != 0)
  10. {
  11. sum += val;
  12. val = va_arg(vList,int);
  13. }
  14. va_end(vList);
  15. return sum;
  16. }

在编写可变参数函数的时候我们需要用到四个宏,这四个宏是:

  • Va_list:该类型变量用来访问可变参数,实际上就是指针

  • Va_start():是一个宏,用来获取参数列表中的参数,使vl指向第一个可变参数,使用完毕后调用va_end()结束

  • va_end:也是一个宏,用来结束va_start()的调用

  • va_arg:宏,用来获参数列表中的取下一个值

这四个宏在Linux上都定义在stdarg.h里面。

Camouflage
2019-04-11 12:18:57

正常的声明,后面 … 表示不定参数

精彩评论

  • eclipse项目 找不到或无法加载主类
    Eclipse错误: 找不到或无法加载主类或项目无法编译10种解决大法: 1、在src文件夹上点右键-Build Path-Use as Source Folder,重新进行编译,一切正常了。 2、在Eclipse工程文件夹上点右键-Refresh,重新编译,一功OK(这个方法一般不起作用)。 3、右键Properties在Java Builder Path的Libraries的标签里面看是否有缺少或者无用的(一般带红差头)的,引入对应的jar包或者删除掉。 4、在Properties里面设置Source.添加你的Java路径.比如src,然后需要设置下面的Default output folder,这里设置你的输出路径也就是class路径了。 5、右键Properties在里面的builder里面把项目的builder.xml引用(import)进来。 6、把右键Properties在Java Builder Path的Libraries全部删除,尤其是jre,然后,点击保存,关闭eclipse,然后再打开,再把对应的jre和lib下边的相关jar引进来,保存,重新编译后就好了,我也不知道为啥,有一次我就这么弄好了。 7、把class下边的有.class文件的话还是这样,把这些.class文件删除掉,然后elipse中菜单project—clear然后选中对应项目,在project菜单下边勾上Build Automaticlly(自动部署),然后生成新的就class文件就OK了。 8、把项目下边的.project删除掉,从同事身边运行正常的项目下边拷贝过来它的.project文件,刷新项目试试。 9、把项目下边的.classpath删除掉,从同事身边运行正常的项目下边拷贝过来它的.classpath文件,刷新项目试试。 10、终极解决办法,也是很管用的解决办法,就是把整个项目删除掉,删除之前把更改的内容提交到CVS或者SVN上,然后重新从SVN或者CVS上把项目档下来。
    2019-05-11 16:35:34 thumb_up( 3 )
  • 算法为什么这么难啊啊啊???
    算法作为一门学问,有两条几乎平行的线索。一个是数据结构(数据对象):数、矩阵、集合、串、排列、图、表达式、分布等等。另一个是算法策略:贪心、分治、动态规划、线性规划、搜索等等。这两条线索是相互独立的:同一个数据对象(例如图)上有不同的问题,例如单源最短路径和最优二叉树,就可以用到不同的算法策略,如贪婪和动态规划;而同一个算法策略,例如排序和整数乘法,也会用到不同的数据结构。它们之间是多对多的关系。
    2019-03-12 11:28:02 thumb_up( 7 )
  • 好多知识还不会,开始焦虑了,该怎么办??
    随波逐流~
    2019-08-23 13:15:51 thumb_up( 1 )
  • 好多知识还不会,开始焦虑了,该怎么办??
    “听说过很多道理,却依然过不好这一生”,那是因为都是别人的道理! 加油,少年 (ง •_•)ง
    2019-08-23 15:44:20 thumb_up( 1 )
  • 好多知识还不会,开始焦虑了,该怎么办??
    大家都一样的,什么也不会!都快毕业了,那就考虑好今后的路要怎么走,要么出来工作,要么继续读书?确定好方向之后,再为之不懈奋斗,把握当下,珍惜时光。祝你好运
    2019-08-24 09:28:29 thumb_up( 1 )
  • 一直搞不懂C++中,指针和引用有什么区别?
    引用是变量的一个别名,内部实现是只读指针,而且只能在初始化时被赋值,其他时候值不能被改变;指针的值可以在任何时候被改变
    2019-03-04 10:49:07 thumb_up( 3 )
  • tcp socket服务端端口监听成功,但是客户端链接不上??
    你这个提问方式有问题啊,起码给个错误截图啊!!!通常通信程序,一是要注意防火墙问题,二是开发的过程中,一定要调用GetLastError函数获取错误码!
    2019-05-06 11:03:16 thumb_up( 4 )
eject