vsprintf 與 vsnprintf

來源:互聯網
上載者:User
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;   }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.