[學習]如何在c函數參數列表中輸入多個值?

1.不借助函數庫html

void fun(int len,...){數組

  int *p=&len;//獲取第一個參數的指針函數

  int i=0;指針

  p++;htm

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

    printf("%d",*p);get

  }string

}變量

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不一樣類型

va_list函數的實質

#define va_list char *

#define va_start(p, first) (p = (va_list)&first + sizeof(first))

#define va_arg(p, next) (*(next*)((p += sizeof(next) ) - sizeof(next)))

#define va_end(p) (p = (va_list)NULL)

 

參考:

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

相關文章
相關標籤/搜索