最近学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

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

精彩评论

  • 操作系统好难啊!大家都是怎么学的?
    也快期末考试了
    2019-04-23 08:36:23 thumb_up( 1 )
  • 操作系统好难啊!大家都是怎么学的?
    短短一学期是不可能学透庞大的操作系统的,毕竟太复杂了。建议在学习操作系统原理的过程中大家把原理知识和典型的简单操作系统分析结合起来!
    2019-04-23 09:18:40 thumb_up( 1 )
  • 你购买"WRITE-BUG技术共享平台"推出的永久VIP了吗
    今天看了Demon-Gan那篇“恶魔成长记”,一篇近万字的文章读下来,我被深深地感动了。真的,我一个男生看的我眼泪都要留下来了。里面的文字不禁让我一次又一次地反思自己,我也是一个大学生啊,我也曾比鸡起得早比狗睡的晚,我也曾昏天黑地用功读书为了梦想挤破脑袋闯过高考大军,然而,我这大学三年多过去了,我都干了些什么,真的是两手空空一无所有。今天是2018年11月12日,距离考研不到40十天了,我还在为着老师布置的程序设计而发愁,出来混迟早要还的真的一点不假,为了那些浪费的时间翘过的课,迟早会会恨到骨子里去的。在最后的这40天里,我希望我能考上,我当然希望我能考上即使不是什么好学校,我希望我还有机会,我希望我还能有一次机会,重新开始。下一次,我当然知道我应该怎么做了,我已经做错那么多了,就想小猪佩奇常常教训自己的弟弟乔治那样“silly George,you do it all wrong!”,今后我一定踏实做人踏实做事。时间线转回主题,今天我看见了Gan在“恶魔的世界群”里发了这个网站,我注册了充了100年的会员,我希望这个网站会越来越好,始终有一群珍爱她的小伙伴,一路上我们一起成长100年,100年对我来说就是永远了吧,100年该有多长啊,我甚至都不知道两年以后是什么样子了。。。。这座城市留下了你的青春,却留不下你。希望这座城市留下了我的青春也能留下我!
    2018-11-12 20:26:07 thumb_up( 19 )
  • 大家自己开发小游戏时候的素材都是去哪里找的?
    看你要做什么类型的游戏啦,如果是RPG之类的,我会找网页版的类似游戏,人物或道具有自己想要的,直接在游戏里找准一个点,右键保存图片就是PNG格式的。 别的类型的同理,实在保存不下来的,就直接百度图片自己PS吧,这样你得调好大小, 清晰度也不能保证? 再有就是自己画,当然这样需要一点功底的,建议用电子画板
    2019-04-13 10:01:23 thumb_up( 4 )
  • 已经有malloc/free了,C++中为什么还需要new/delete
    肯定是有去别的!malloc/free是C语言的,new/delete是C++的
    2019-02-28 11:22:24 thumb_up( 2 )
eject