C語言變參:VA_LIST
在使用C語言的變參時,需要將變參放在最後一個參數的位置,並且變參前面至少要有一個普通參數
① 函數定義一個va_list的變量,這個變量是指向參數的指針。
②調用va_start(va_list ap,char *fmt)操作,將定義的va_list變量指向變參列表,這個宏的第二個參數是第一個可變參數的前一個參數,是一個固定參數指明參數的類型。%d%s%c
③調用va_arg(va_list ap,Tpye)操作獲得每個參數,其中第二個參數就是你要返回的參數類型(如果函數有多個可變參數的,依次調用VA_ARG獲取各個參數,訪問完後自動指向下一個參數)//Type是指參數的類型
④調用va_end()操作,清空va_list變量
在第三步的時候事先根本不知道參數的類型,調用va_arg()就很不方便,當調用va_start()操作後,ap已經指向變參列表,然後可以調用vprintf(const char *fmt,va_list ap)將參數進行輸出,也可以調用vsnprintf(char *str,size_t size,const char *fmt, va_list ap)來將變參保存起來進行處理
/*
* va_list.cpp
*
* Created on: 2017年9月15日
* Author: guojing
*/
#include<iostream>
#include<stdio.h>
#include<stdarg.h>
#include<sstream>
using namespace std;
int print_arg(char *fmt,...)
{
va_list Arg_List;
char str[100];
va_start(Arg_List,fmt);//用va_start宏初始化變量,這個宏的第二個參數是第一個可變參數的前一個參數,是一個固定的參數
int i=vsnprintf(str,100,fmt,Arg_List);
va_end(Arg_List);
ostringstream str_str;
str_str<<str;
cout<<str_str.str()<<endl;
return i;
};
int main()
{
cout<<print_arg("%s,%d,%d,%d","guojin",1,2,3);//輸出12,把間隔逗號也會在計算範圍內
return 0;
}