vsprintf
/* 函數名: vsprintf 功 能: 送格式化輸出到串中 傳回值: 正常情況下返回產生字串的長度(除去/0),錯誤情況返回負值 用 法: int vsprintf(char *string, char *format, va_list param); 注: 該函數會出現記憶體溢出情況,建議使用vsnprintf 程式例: */ #include <stdarg.h> char buffer[80]; int vspf(char *fmt, ...) { va_list argptr; int cnt; va_start(argptr, fmt); cnt = vsprintf(buffer, fmt, argptr); va_end(argptr); return(cnt); } int main(void) { int inumber = 30; float fnumber = 90.0; char string[4] = "abc"; vspf("%d %f %s", inumber, fnumber, string); printf("%s/n", buffer); return 0; } 該程式結果為 30 90.000000 abc VA_LIST的用法( VA_LIST 是在C語言中解決變參問題的一組宏): (1)首先在函數裡定義一具VA_LIST型的變數,這個變數是指向參數的指標 (2)然後用VA_START宏初始設定變數剛定義的VA_LIST變數,這個宏的第二個 參數是第一個可變參數的前一個參數,是一個固定的參數。(如在運行VA_START (ap,v)以後,ap指向第一個可變參數在堆棧的地址。) (3)然後用VA_ARG返回可變的參數,VA_ARG的第二個參數是你要返回的參數的類型。 (4)最後用VA_END宏結束可變參數的擷取。然後你就可以在函數裡使用第二個參數了。 如果函數有多個可變參數的,依次調用VA_ARG擷取各個參數。 _vsnprintf 標頭檔: #include <stdarg.h> 函式宣告: int _vsnprintf(char *buffer, size_t max_count, const char *format, va_list vArgList); 參數說明: 1. char *buffer [out],把產生的格式化的字串存放在這裡. 2. size_t max_count [in], buffer可接受的最大位元組數,防止產生數組越界. 3. const char *format [in], 格式化字串 4. va_list vArgList [in], va_list變數. va:variable-argument:可變參數 用法類似於vsprintf,只不過加了max_count的限制. 傳回值說明: 如果成功調用此函數,返回寫到buffer中的字元的個數(不包括結尾的'/0')。snprintf和vsnprintf函數不能夠寫多於size大小(包括結尾的'0')的位元組數。如果輸出因為以上原因被截斷,返回成功寫入buffer的字元數(不包括結尾的'/0'),如果有足夠的記憶體空間的話。所以,如果傳回值等於size或者大於size,表示輸出到buffer的字元被截斷,如果輸出過程中遇到錯誤,則返回一個負數。 編輯本段用法執行個體 int mon_log(char* format, ...) { va_list vArgList; //定義一個va_list型的變數,這個變數是指向參數的指標. va_start(vArgList, format); //用va_start 宏初始設定變數,這個宏的第二個參數是第一個可變參數的前一個參數,是一個固定的參數. _vsnprintf(str_tmp, 3, format, vArgList); //注意,不要漏掉前面的_ va_end(vArgList); //用va_end 宏結束可變參數的擷取 return 0; } //調用上面的函數 mon_log("%d,%d,%d,%d", 1,2,3,4); 傳回值用法: #include <stdio.h> #include <stdlib.h> #include <stdarg.h> char * make_message(const char *fmt, ...) { /* 初始時假設我們只需要不超過100位元組大小的空間 */ int n, size = 100; char *p; va_list ap; if ((p = (char *)malloc(size)) == NULL) return NULL; while (1) { /* 嘗試在申請的空間中進行列印操作 */ va_start(ap, fmt); n = vsnprintf (p, size, fmt, ap); va_end(ap); /* 如果vsnprintf調用成功,返回該字串 */ if (n > -1 && n < size) return p; /* vsnprintf調用失敗(n<0)或者p的空間不足夠容納size大小的字串(n>=size),嘗試申請更大的空間*/ size *= 2; /* 兩倍原來大小的空間 */ if ((p = (char *)realloc(p, size)) == NULL) return NULL; } } int main() { /* 調用上面的函數 */ char* str = make_message("%d,%d,%d,%d",5,6,7,8); printf("%s/n",str); return 0; }