snprintf和sprintf區別分析

2021-07-09 03:48:48 字數 2009 閱讀 7856

今天在專案中使用snprintf時遇到乙個比較迷惑的問題,追根溯源了一下,在此對sprintf和snprintf進行一下對比分析。

因為sprintf可能導致緩衝區溢位問題而不被推薦使用,所以在專案中我一直優先選擇使用snprintf函式,雖然會稍微麻煩那麼一點點。這裡就是sprintf和snprintf最主要的區別:snprintf通過提供緩衝區的可用大小傳入引數來保證緩衝區的不溢位,如果超出緩衝區大小則進行截斷。但是對於snprintf函式,還有一些細微的差別需要注意。

sprintf函式返回的是

實際輸出

到字串緩衝中的字元個數,包括null結束符。而

snprintf函式返回的是應該輸出到字串緩衝的字元個數(也包括null結束符)

,所以snprintf的返回值可能大於給定的可用緩衝大小以及最終得到的字串長度。

所以在使用snprintf函式的返回值時,需要小心慎重,避免人為造成的緩衝區溢位,不然得不償失。

#include int main(),tlist_2[1024]=;

char fname[7][8] = ;

int i = 0, len_1,len_2 = 0;

len_1 = snprintf(tlist_1,1024,"%s;",fname[0]);

len_2 = sprintf(tlist_2,"%s;",fname[0]);

printf("len1=%d, len2=%d \n", len_1, len_2);

printf("tlist_1: %s\n",tlist_1);

printf("tlist_2: %s\n",tlist_2);

len_1 = snprintf(tlist_1,1024,"%s%s;",tlist_1,fname[1]);

len_2 = sprintf(tlist_2,"%s%s;",tlist_2,fname[1]);

printf("len1=%d, len2=%d \n", len_1, len_2);

printf("tlist_1: %s\n",tlist_1);

printf("tlist_2: %s\n",tlist_2);

len_1 = snprintf(tlist_1,1024,"%s%s;",tlist_1,fname[2]);

len_2 = sprintf(tlist_2,"%s%s;",tlist_2,fname[2]);

printf("len1=%d, len2=%d \n", len_1, len_2);

printf("tlist_1: %s\n",tlist_1);

printf("tlist_2: %s\n",tlist_2);

}

len1=3, len2=3 

tlist_1: a1;

tlist_2: a1;

len1=3, len2=6 

tlist_1: b1;

tlist_2: a1;b1;

len1=3, len2=9 

tlist_1: c1;

tlist_2: a1;b1;c1;

知其然就應該知其所以然,這是良好的求知態度,所以果斷翻glibc的源**去,不憑空想當然。下面用**說話,這就是開源的好處之一。首先看snprintf的實現:

int snprintf(char *str, size_t size, const char *format, ...)。

將可變個引數(...)按照format格式化成字串,然後將其複製到str中

(1) 如果格式化後的字串長度 < size,則將此字串全部複製到str中,並給其後新增乙個字串結束符('\0');

(2) 如果格式化後的字串長度 >= size,則只將其中的(size-1)個字元複製到str中,並給其後新增乙個字串結束符('\0'),返回值為欲寫入的字串長度。

函式返回值:若成功則返回欲寫入的字串長度,若出錯則返回負值。

snprintf在格式化字元緩衝區之前會將str清空,而sprintf不會有清空操作。

sprintf和snprintf的區別

因為sprintf可能導致緩衝區溢位問題而不被推薦使用,優先選擇使用snprintf函式,雖然會稍微麻煩那麼一點點。這裡就是sprintf和snprintf最主要的區別 snprintf通過提供緩衝區的可用大小傳入引數來保證緩衝區的不溢位,如果超出緩衝區大小則進行截斷。但是對於snprintf函式,...

sprintf和snprintf的定義及區別

功能 把格式化的資料寫入某個字串緩衝區。標頭檔案 stdio.h 原型 int sprintf char buffer,const char format,argument 引數列表 buffer char型指標,指向將要寫入的字串的緩衝區 format 格式化字串 argument 可選引數,可以...

strncpy和snprintf的正確用法詳解

copyleft by bitfly permalink 正文 strncpy的正確用法 strncpy dest,src,sizeof dest dest sizeof dest 1 0 snprintf的正確用法 snprintf dest,sizeof dest s src strncpy的問...