C語言可變引數使用介紹

2021-08-27 08:53:47 字數 2070 閱讀 5750

我們可能常常在linux c中看見一些函式,特別是輸出函式,或可以格式轉化的函式,比如printf等函式,他的引數是可變的。

int printf(const char *format, ...);
int vprintf(const char *format, va_list ap);

int vfprintf(file *stream, const char *format, va_list ap);

int vsprintf(char *str, const char *format, va_list ap);

int vsnprintf(char *str, size_t size, const char *format, va_list ap);

那麼該如何編寫自己的變參函式呢,這就要用到處理變參的三個方法:va_start, va_arg, va_end , 這三個方法包含在標頭檔案 stdarg.h 中,這三個方法的原型為:

va_list ap;                        //首先定義乙個va_list型別的變數

void va_start(va_list ap, last); //va_start 的第乙個引數為va_list變數,第二個引數為函式的最後乙個固定引數

void va_end(va_list ap); //用va_end結束迭代, ap is undefined

type va_arg(va_list ap, type);

特別是在這中函式裡面,我們進行格式轉化時,使用:int_vsnprintf(char*str,size_tsize,constchar*format,va_listap);

vsnprintf,c語言庫函式之一,屬於可變引數。用於向字串中列印資料、資料格式使用者自定義。

標頭檔案:

#include

函式宣告:

int_vsnprintf(char*str,size_tsize,constchar*format,va_listap);

引數說明:

char *str [out],把生成的格式化的字串存放在這裡.

size_t size [in], str可接受的最大位元組數,防止產生陣列越界.

const char *format [in], 指定輸出格式的字串,它決定了你需要提供的可變引數的型別、個數和順序。例如" %d,%d\n " ;  "my age is :" "%d years old\n" ;

va_list ap [in], va_list變數. va:variable-argument:可變引數(就是後面...中所包含的內容,存到這個變引數的變數當中去)

函式功能:將可變引數格式化輸出到乙個字元陣列。

用法類似於vsprintf,不過加了size的限制,防止了記憶體溢位(size為str所指的儲存空間的大小)。

返回值:執行成功,返回寫入到字元陣列str中的字元個數(不包含終止符),最大不超過size;執行失敗,返回負值,並置errno.[1] 

備註:

linux環境下是:vsnprintf

vc6環境下是:_vsnprintf

涉及到的…的替代方式:

__va_args__
va_start(args,fmt);

size_t buf_len = vsnprintf(buffer,max_log_len, str_format,args);

va_end(args);

可變引數的例項:

#define _crt_secure_no_warnings

#include #include void sumq(char *fmt , ...)

int main()

日誌功能部分後面部分再加上去。

C語言可變引數的使用

可變引數函式指的是函式引數個數不固定的函式,類似printf char fmt,如果想自己寫乙個可變引數的函式,需要用到stdarg.h標頭檔案中的如下幾個巨集 void va start va list arg ptr,prev param type va arg va list arg ptr,...

C語言可變引數如何使用

編寫乙個名叫max list的函式,它用於檢查任意數目的整型引數並返回它們中最大值,引數列表必須以負值結尾,提示列表結束。這個題目的重點是任意數目的整型引數,所以並不確定傳入的引數數量,這裡就可以使用可變引數。include include int max list int x,printf tmp...

c 語言可變引數

1 當無法列出傳遞函式的所有實參的型別和數目時,可用省略號指定參數列 void foo void foo parm list,2 函式引數的傳遞原理 函式引數是以資料結構 棧的形式訪問,從右至左入棧.eg include void fun int a,int main output 12 343 獲...