1. 程式人生 > >sprintf和snprintf函數

sprintf和snprintf函數

toc light view 提示 esp 如果 def 數組 oar

printf()/sprintf()/snprintf()區別
先貼上其函數原型
printf( const char *format, ...) 格式化輸出字符串,默認輸出到終端-----stdout
sprintf(char *dest, const char *format,...) 格式化輸出字符串到指定的緩沖區
snprintf(char *dest, size_t size,const char *format,...) 按指定的SIZE格式化輸出字符串到指定的緩沖區

printf()函數在這就不再討論,這裏主要討論sprintf()與snprintf()的用法及區別,

[plain] view plain copy
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. using namespace std;
  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6. char *p1="China";
  7. char a[20];
  8. sprintf(a,"%s",p1);
  9. printf("%s\n",a);
  10. memset(a,0,sizeof(a));
  11. _snprintf(a,3,"%s",p1);
  12. printf("%s\n",a);
  13. printf("%d\n",strlen(a));
  14. return 0;
  15. }


結果輸出:
China
Chi
3
分析:
sprintf(a,"%s",p1) 把p1字符串拷貝到數組a中(‘\0‘也拷貝過去了)。
snprintf(a,3,"%s",p1) 拷貝P1中前3個字符到數組a中,並在末尾自動添加‘\0‘。
sprintf屬於I/O庫函數,snprintf函數並不是標準c/c++中規定的函數,但是在許多編譯器中,廠商提供了其實現的版本。在gcc中,該函數名稱就snprintf,而在VC中稱為_snprintf。 如果你在VC中使用snprintf(),會提示此函數未聲明,改成_snprintf()即可。

註意點:
1 sprintf是一個不安全函數,src串的長度應該小於dest緩沖區的大小,(如果src串的長度大於或等於dest緩沖區的大小,將會出現內存溢出。)
2 snprintf中源串長度應該小於目標dest緩沖區的大小,且size等於目標dest緩沖區的大小。(如果源串長度大於或等於目標dest緩沖區的大小,且size等於目標dest緩沖區的大小,則只會拷貝目標dest緩沖區的大小減1個字符,後加‘\0‘;該情況下,如果size大於目標dest緩沖區的大小則溢出。)
3 snprintf ()函數返回值問題, 如果輸出因為size的限制而被截斷,返回值將是“如果有足夠空間存儲,所能輸出的字符數(不包括字符串結尾的‘\0‘)”,這個值和size相等或者比size大!也就是說,如果可以寫入的字符串是"0123456789ABCDEF"共16位,但是size限制了是10,這樣 snprintf() 的返回值將會是16 而不是10

轉載鏈接:http://blog.csdn.net/czxyhll/article/details/7950247

sprintf和snprintf函數