snprintf的返回值的問題

2022-09-12 05:00:14 字數 1156 閱讀 4896

今天寫了段**,為了防止越界,使用了snprintf,debug的時候發現有些問題,發現返回值並不是寫入資料的長度,而是需要複製的原內容的長度,大跌眼鏡,怪不得微軟後面還推薦了snprintf_s這個函式,之前一直不知道所以然,現在才發現還是有根據的,如果在**中使用了這個函式,真的要注意這個函式的返回值。

snprintf的函式原型為:

int snprintf(char *str, size_t size, const char *format, …);

說明:之前以為snprintf的返回值是實際寫入到str字串的長度,實際上不是,要分兩種情況。

1) 如果要輸出的字串的長度< size, 因為snprintf會自動將\0追加入到str中,snprintf的返回值是實際寫入緩衝區的長度。

2) 如果要輸出的字串長度》= size, 則表明緩衝區的長度不夠寫入原有的長度,則snprintf的返回值為理想中要複製的字串長度,所以其返回值可能會出現》= size的情況。但是事實上寫入緩衝區的內容為原定的緩衝區的大小-1,同時後面追加『\0』。不會出現越界的問題,只是這個時候需要注意返回值,不是緩衝區寫入的大小。

int testsnprintf()

;int nret = 32;

//此段程式在buff後面迴圈加上資料,ssrc長度固定,返回值一直都是ssrc的長度10,

//當可用buff足夠的時候,迴圈第0-2時,字串長度(strlen)每次增長的長度都是10;

//但是當可用buff不足的時候,只能輸入限定的位元組長度,字串後續不再增長。

for (int i = 0;i < 5;i++)

return 0;

}返回結果

0000---iszlen=10,strlen(buff)=10,0123456789

0001---iszlen=10,strlen(buff)=20,01234567890123456789

0002---iszlen=10,strlen(buff)=30,012345678901234567890123456789

0003---iszlen=10,strlen(buff)=31,0123456789012345678901234567890

0004---iszlen=10,strlen(buff)=31,0123456789012345678901234567890

snprintf返回值陷阱封裝

snprintf 函式用於將格式化的資料寫入字串,其原型為 int snprintf char str,int size,char format argument,返回值 對於snprintf有乙個不安全的地方就是它的返回值 當要寫入的argument的長度大於str的長度時,返回值不是str的長度...

getchar的返回值問題

getchar的返回值問題 許多初學者都習慣用 char 型變數接收 getchar getc,fgetc 等函式的返回值,其實這麼做是不對的,並且隱含著足以致命的錯誤。getchar 等函式的返回值型別都是 int 型,當這些函式讀取出錯或者讀完檔案後,會返回 eof。eof 是乙個巨集,標準規定...

fread 返回值的問題

linux programmer s manual name fread,fwrite binary stream input output synopsis include size t fread void ptr,size t size,size t nmemb,file stream siz...