snprintf()函數使用方法


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

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

函數說明:
最多從源串中拷貝size-1個字符到目標串中,然后再在后面加一個0。所以如果目標串的大小為size的話,將不會溢出。
函數返回值:

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

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

假設我想將一個char類型的變量打印成2位的10進制,我應該怎么寫呢?

char a='a';
char str[20];
snprintf(str,2,"%02d",a);
  1. 2不應該是2,應該是3.
  2. 也不建議直接寫3,應該寫sizeof(str)

所以建議的寫法是:

char a='a';
char str[3];//再大點也沒有問題
snprintf(str,sizeof(str),"%02d",a);

解釋如下:

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

在snprintf(dest, size, "str: %s\n", src)中如果size-1大於等於"str: %s\n"的長度,則把"str: %s\n"都拷貝到dest; 如果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();


免責聲明!

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



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