_vsnprintf在可變參數打印中的用法


_vsnprintf,C語言庫函數之一,屬於可變參數。用於向字符串中打印數據、數據格式用戶自定義。

 

函數簡介

編輯
頭文件:
#include <stdarg.h>
函數聲明:
int _vsnprintf(char* str, size_t size, const char* format, va_list ap);
參數說明:
  1. char *str [out],把生成的格式化的字符串存放在這里.
  2. size_t size [in], str可接受的最大字符數[1]   (非字節數,UNICODE一個字符兩個字節),防止產生 數組越界.
  3. const char *format [in], 指定輸出格式的字符串,它決定了你需要提供的可變參數的類型、個數和順序。
  4. va_list ap [in], va_list變量. va:variable-argument:可變參數
函數功能:將可變參數格式化輸出到一個字符數組。
用法類似於vsprintf,不過加了size的限制,防止了內存溢出(size為str所指的存儲空間的大小)。
返回值:執行成功,返回寫入到字符數組str中的字符個數(不包含終止符),最大不超過size;執行失敗,返回負值,並置 errno.[2]  
備注:
linux環境下是:vsnprintf
VC6環境下是:_vsnprintf
 

用法實例

 1 #include <stdio.h>
 2 #include <stdarg.h>
 3 int mon_log(char* format, ...)
 4 {
 5 char str_tmp[50];
 6 int i=0;
 7 va_list vArgList;                            //定義一個va_list型的變量,這個變量是指向參數的指針.
 8 va_start (vArgList, format);                 //用va_start宏初始化變量,這個宏的第二個參數是第一個可變參數的前一個參數,是一個固定的參數
 9 i=_vsnprintf(str_tmp, 50, format, vArgList); //注意,不要漏掉前面的_
10 va_end(vArgList);                            //用va_end宏結束可變參數的獲取
11 return i;                                    //返回參數的字符個數中間有逗號間隔
12 }
13 //調用上面的函數
14 void main() 
15 {
16     int i=mon_log("%s,%d,%d,%d","asd",2,3,4);
17     printf("%d\n",i);
18 }
輸出 9。
asd,2,3,4
123456789 (共9個字符,間隔符逗號計算在內)[2]  

返回值用法

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stdarg.h>
 4 char *make_message(const char *fmt, ...) 
 5 {
 6     /* 初始時假設我們只需要不超過100字節大小的空間 */
 7     int n, size = 100;
 8     char *p;
 9     va_list ap;
10     if ( (p = (char *) malloc(size*sizeof(char))) == NULL)
11     return NULL;
12     while (1) 
13     {
14         /* 嘗試在申請的空間中進行打印操作 */
15         va_start(ap, fmt);
16         n = vsnprintf (p, size, fmt, ap);
17         va_end(ap);
18         /* 如果vsnprintf調用成功,返回該字符串 */
19         if (n > -1 && n < size)
20         return p;
21         /* vsnprintf調用失敗(n<0),或者p的空間不足夠容納size大小的字符串(n>=size),嘗試申請更大的空間*/
22         size *= 2; /* 兩倍原來大小的空間 */
23         if ((p = (char *)realloc(p, size*sizeof(char))) == NULL)
24         return NULL;
25     }
26 }
27 int main() 
28 {
29     /* 調用上面的函數 */
30     char* str = make_message("%d,%d,%d,%d",5,6,7,8);
31     printf("%s\n",str);
32     free(str);
33     /* we allocate the memory in the make_message function, so we should release it by caller(main function). */
34     return 0;
35 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM