三個打印函數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!


免責聲明!

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



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