sprintf和snprintf函數
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()的用法及區別,
- #include "stdafx.h"
- #include <stdio.h>
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- char *p1="China";
- char a[20];
- sprintf(a,"%s",p1);
- printf("%s\n",a);
- memset(a,0,sizeof(a));
- _snprintf(a,3,"%s",p1);
- printf("%s\n",a);
- printf("%d\n",strlen(a));
- return 0;
- }
結果輸出:
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函數