snprintf()函式用於將格式化的資料寫入字串,其原型為:
int snprintf(char *str, int size, char * format [, argument, ...]);
返回值:
對於snprintf有乙個不安全的地方就是它的返回值:當要寫入的argument的長度大於str的長度時,返回值不是str的長度,而是argument的長度。
#include
#include
intmain
(void);
int ret_len =0;
char
* arg =
"hello world"
; ret_len =
snprintf
(str,
sizeof
(str)
,"%s"
, arg)
;printf
("str = %s\nret_len = %d\n"
, str, ret_len)
;return0;
}
輸出結果:
返回的長度是11而不是4,不注意的話,下邊的使用可能有問題。所以我們需要對返回值進行封裝。
int
my_snprintf
(char
* buf,
int max,
char
* fmt,..
.)//用來判斷buf長度是否已經用完
if(max <=1)
va_start
(argp, fmt)
; len =
vsnprintf
(buf, max, fmt, argp)
;//用來限定返回值是我們實際寫入的位元組數
len = len > max -
1? max -
1: len;
va_end
(argp)
;return len;
}
這上面用到了可變引數,首先我們需要先了解可變引數的原理。推薦一篇文章講的挺清楚的,不懂這個可變引數原理的大家可以去下面那個鏈結去看。
可變引數原理
原看到這篇文章的小夥伴都能搞懂!!!
snprintf的返回值的問題
今天寫了段 為了防止越界,使用了snprintf,debug的時候發現有些問題,發現返回值並不是寫入資料的長度,而是需要複製的原內容的長度,大跌眼鏡,怪不得微軟後面還推薦了snprintf s這個函式,之前一直不知道所以然,現在才發現還是有根據的,如果在 中使用了這個函式,真的要注意這個函式的返回值...
WebUtils封裝返回值
在專案會有一些請求來規定返回值給前台,一般封裝個jsonobject物件即可,主要包括 code code,msg message,data data三個字段 主要有成功和出錯的兩種情況,這裡我們可以封裝乙個responseenum列舉類專門用於錯誤 和錯誤資訊提示 如下類public enum r...
函式返回值和封裝
需要用到函式內部的變數或者是函式的時候需要使用return 進行資料返回 函式返回值 return 可以將函式內部的變數或函式返回到函式外面去使用 語法 return 需要返回的內容 特點 return 一次只能返回乙個,寫多個最後只會返回最後乙個 函式中只要遇到return函式就結束了 retur...