變參

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;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章