首页 > 其他 > 详细

[学习]如何在c函数参数列表中输入多个值?

时间:2019-08-02 16:03:02      阅读:134      评论:0      收藏:0      [点我收藏+]

1.不借助函数库

void fun(int len,...){

  int *p=&len;//获取第一个参数的指针

  int i=0;

  p++;

  for(;i<len;i++){

    printf("%d",*p);

  }

}

fun(5,2,3,4,5,6);//第一个参数为输入的数值个数

2.借助函数库

#include <stdarg.h>

 

//int型例子

fun(5,2,3,4,5,6);【第一个参数为输入参数列表长度,便于获取参数长度,当然也可以不使用它(请看int型例子2)】

void fun(int len,...){

  va_list ap;//新建参数列表信息数组 其实va_list实质为char *

  va_start(ap,len);//初始化 获取len之前的参数(参数入栈是从右到左的,所以len是最后一个,也就是栈顶元素)

  int val;

  for(int i=0;i<len;i++){

    val=va_arg(ap,int);//获取参数信息,第二个参数为参数列表的数据类型(注意:如果参数列表存‘a‘、‘c‘这种字符型右值,会被识别为int型的),返回值要与参数列表数据类型一致

    printf("%d ",val);

  }

  va_end(ap);//ap置为NULL

}

 

//const char* 例子

fun("demo","we","are","programmer","") //我们依靠指针访问数据,所以故意留个"",目的是为了有个结束标志

 

fun(const char* flag,..){  

  va_list ap;

  va_start(ap,flag);

  char *s;

  while(1){

    s=va_arg(ap,char *);//省略const

    if(strcmp(s,"")){  //比较获取的参数是否 为""(即为最后一个参数,这个作为结束标志)//既然用了strcmp就引个string.h的头吧

      break;

    }else{

      printf("%s ",s);

    }

  }

}

 

 

//int型例子2【多余的例子可以不看】

#define END_TARGET 99999999 //比如设置一个END_TARGET作为结束标志,每次参数最后都带一个

fun(5,2,3,4,5,6,END_TARGET);【第一个参数为输入参数列表长度,便于获取参数长度,当然也可以不使用它(请看int型例子2)】

void fun(int start_target,...){ //不过此时start_target为废变量了

  va_list ap;//新建参数列表信息数组 其实va_list实质为char *

  va_start(ap,start_target);

  int val;

  while(1){ 

    val=va_arg(ap,int);//获取参数信息,第二个参数为参数列表的数据类型(注意:如果参数列表存‘a‘、‘c‘这种字符型右值,会被识别为int型的),返回值要与参数列表数据类型一致

    if(END_TARGET==val){  //取到结束标志就结束

      break;

    }

    printf("%d ",val);

  }

  va_end(ap);//ap置为NULL

}

 

注意:参数列表可以不与va_start(参数1<va_list>,参数2<参数列表位置>)参数2不同类型

 

参考:

https://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html

 

[学习]如何在c函数参数列表中输入多个值?

原文:https://www.cnblogs.com/kiik/p/11289063.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!