我們可能常常在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 獲...