眾所周知,sprintf不能檢查目標字串的長度,可能造成眾多安全問題,所以都會推薦使用snprintf.
自從snprintf代替了sprintf,相信大家對snprintf的使用都不會少,函式定義如下:
intsnprintf(char
*str, size_t size,const
char
*format, ...);
函式說明:
最多從源串中拷貝
size-1
個字元到目標串中,然後再在後面加乙個
0。所以如果目標串的大小為size
的話,將不會溢位。
函式返回值:
若成功則返回欲寫入的字串長度,若出錯則返回負值。
但是大家在使用snprintf的時候是否真的清楚引數裡size的意思呢?看下面的例子:
假設我想將乙個char型別的變數列印成2進製,我應該怎麼寫呢?
之前有個同事這樣寫的:
char
a='a';
char
str[20];
snprintf(str,2,"%02x",a);
對不對呢,錯了。
1). 2不應該是2,應該是3.
2). 也不建議直接寫3,應該寫sizeof(str)
所以建議的寫法是:
char
a='a';
char
str[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的返回值是欲寫入的字串(即源字串)
長度,而不是實際寫入的字串度。如:
char
test[8];int
ret= snprintf(test,5,"1234567890"); printf("%d|%s\n",ret,test);
執行結果為:
10|1234
linux和windows下是不同的
linux下用的是snprintf();
而windows下用的是_snprintf();
snprintf 函式使用方法
眾所周知,sprintf不能檢查目標字串的長度,可能造成眾多安全問題,所以都會推薦使用snprintf.intsnprintf char str,size t size,constchar format,函式說明 最多從源串中拷貝size 1個字元到目標串中,然後再在後面加乙個0。所以如果目標串的大...
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...