sprintf和snprintf的定義及區別

2021-07-25 00:27:26 字數 1465 閱讀 7662

功能:把格式化的資料寫入某個字串緩衝區。

標頭檔案:stdio.h

原型:int sprintf( char *buffer, const char *format, [ argument] … );

引數列表:buffer:char型指標,指向將要寫入的字串的緩衝區;format:格式化字串;[argument]...:可選引數,可以是任何型別的資料。

返回值: 返回成功寫入buffer 的字元數,出錯則返回-1. 如果 buffer 或 format 是空指標,且不出錯而繼續,函式將返回-1,並且 errno 會被設定為 einval。sprintf 返回被寫入buffer 的位元組數,結束字元『\0』不計入內。即,如果「hello」被寫入空間足夠大的buffer後,函式sprintf 返回5。

功能:用於將格式化的資料寫入字串

*1 如果格式化後的字串長度 < n,則將此字串全部複製到str中,並給其後新增乙個字串結束符('\0');

*2 如果格式化後的字串長度 >= n,則只將其中的(n-1)個字元複製到str中,並給其後新增乙個字串結束符('\0'),返回值為欲寫入的字串長度。(跟編譯器有關)

標頭檔案:stdio.h

原型:int snprintf(char *str, int n, char * format [, argument, ...]);

引數列表:str為要寫入的字串;n為要寫入的字元的最大數目,超過n會被截斷;format為格式化字串,與printf()函式相同;[argument]...:可選引數,可以是任何型別的資料。

返回值:成功則返回引數str 字串長度,失敗則返回-1,錯誤原因存於errno 中。

**注意**:snprintf()並不是標c中規定的函式,在gcc中,該函式名稱就snprintf(),而在vc中稱為_snprintf()。由於不是標準函式,沒有乙個統一的標準來規定該函式的行為。所以不同編譯器結果可能不同。[參考](

在vs2008中需在預編譯處加入

』 #if _msc_ver

#define snprintf _snprintf

#endif

』 通用ansi unicode 通用定義 _sntprintf

*1 gcc中的引數n表示向str中寫入n個字元,包括』\0』字元,並且返回實際的字串長度;

*2 vc中的引數n表示會向str中寫入n個字元,不包括』\0』字元,並且不會在字串末尾新增』\0』符。當字串長度超過引數n時,函式返回-1,以表示可能導致錯誤

snprintf比sprintf更加安全,可以控制寫入字串長度;

snprintf會先把目標字串清空,然後寫入;而sprintf不會。這會導致問題參考

返回值不同。snprintf成功則返回欲寫入字串長度即格式化後字串長度,失敗則返回負值;sprintf返回成功寫入字串長度,出錯返回-1。所以在使用返回值時候一定要注意特別是snprintf;

sprintf 函式和strchr 函式

可以用sprintf 函式把資訊輸出到字串,用法和printf fprintf類似,但應保證字串足夠大。strchr 函式 查詢字串s中首次出現字元c的位置,成功則返回要查詢字元第一次出現的位置,失敗返回null include include include include include inc...

sscanf 和 sprintf的用法

一 sprintf sprint函式原型為int sprintf char str,const char format,作用是格式化字串,具體功能如下所示 1 將數字變數轉換為字串。2 得到整型變數的 16進製制和 8進製字串。3 連線多個字串。舉例如下 char str 256 int data ...

snprintf和sprintf區別分析

今天在專案中使用snprintf時遇到乙個比較迷惑的問題,追根溯源了一下,在此對sprintf和snprintf進行一下對比分析。因為sprintf可能導致緩衝區溢位問題而不被推薦使用,所以在專案中我一直優先選擇使用snprintf函式,雖然會稍微麻煩那麼一點點。這裡就是sprintf和snprin...