snprintf的返回值的問題


今天寫了段代碼,為了防止越界,使用了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()
{
char *sSrc = "0123456789";
int iSzLen = 0;
char buff[32] = { 0 };
int nRet = 32;

//此段程序在buff后面循環加上數據,sSrc長度固定,返回值一直都是sSrc的長度10,
//當可用buff足夠的時候,循環第0-2時,字符串長度(strlen)每次增長的長度都是10;
//但是當可用buff不足的時候,只能輸入限定的字節長度,字符串后續不再增長。
for (int i = 0;i < 5;i++)
{
iSzLen = snprintf(buff+strlen(buff), 32-strlen(buff), "%s", sSrc);
printf("000%d---iSzLen=%d,strlen(buff)=%d,%s\r\n", i, iSzLen, strlen(buff), buff);
}
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

 


免責聲明!

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



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