snprintf返回值陷阱封裝

2021-10-23 13:58:09 字數 1242 閱讀 6377

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...