snprintf 函式使用方法

2021-06-02 22:12:16 字數 1406 閱讀 3877

眾所周知,sprintf不能檢查目標字串的長度,可能造成眾多安全問題,所以都會推薦使用snprintf.

intsnprintf(char*str, size_t size,constchar*format, ...);

函式說明:

最多從源串中拷貝size-1個字元到目標串中,然後再在後面加乙個0。所以如果目標串的大小為size

的話,將不會溢位。

函式返回值:

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

但是大家在使用snprintf的時候是否真的清楚引數裡size的意思呢?看下面的例子:

假設我想將乙個char型別的變數列印成2進製,我應該怎麼寫呢?

之前有個同事這樣寫的:

chara=

'a';

charstr[20];

snprintf(str,2,"%02x",a);

對不對呢,錯了。

1). 2不應該是2,應該是3.

2). 也不建議直接寫3,應該寫sizeof(str)

所以建議的寫法是:

chara=

'a';

charstr[3];//再大點也沒有問題

snprintf(str,sizeof(str),"%02x",a);

解釋如下:

size是限定最終生成的dest的字元數,最多拷貝size-1個字元;一般情況下size會取sizeof(dest),這是為了dst不溢位.

在snprintf(dest, size, "str: %s\n", src)中如果size-1大於等於"str: %s\n"的長度,則把"str: %s\n"都拷貝到dst; 如果size-1小於"str: %s\n"的長度,則從"str: %s\n"拷貝size-1長度的字串到dst,並且末尾置\0.

就是說,拷貝的長度是size-1和源字串長度的最小值;

對於返回值,需要注意的是snprintf的返回值是欲寫入的字串(即源字串)

長度,而不是實際寫入的字串度。如:

chartest[8];intret= snprintf(test,5,"1234567890"); printf("%d|%s\n",ret,test);

執行結果為:

10|1234

linux和windows下是不同的

linux下用的是snprintf();

而windows下用的是_snprintf();

snprintf 函式使用方法

眾所周知,sprintf不能檢查目標字串的長度,可能造成眾多安全問題,所以都會推薦使用snprintf.自從snprintf代替了sprintf,相信大家對snprintf的使用都不會少,函式定義如下 intsnprintf char str,size t size,const char forma...

snprintf 函式使用方法

函式定義如下 int snprintf char str,size t size,constchar format,函式功能 先將可變引數 按照format的格式格式化為字串,然後再將其拷貝至dest str中。注意事項 如果格式化後的字串長度小於size,則將字串全部拷貝至dest str中,並在...

snprintf 函式使用方法

眾所周知,sprintf不能檢查目標字串的長度,可能造成眾多安全問題,所以都會推薦使用snprintf.自從snprintf代替了sprintf,相信大家對snprintf的使用都不會少,函式定義如下 int snprintf char str,size t size,constchar forma...