sprintf 是個變參函式

2021-07-02 23:54:50 字數 2781 閱讀 7380

字串

格式化命令

,主要功能是把格式化的資料寫入某個

字串中。

由於sprintf 跟printf

在用法上幾乎一樣,只是列印的目的地不同而已,

前者列印到字串中,後者則直接在命令列上輸出

。這也導致sprintf 比printf 有用得多。 1,

標頭檔案:

stdio.h

函式原型:

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

引數列表:

buffer:char型指標,指向將要寫入的字串的緩衝區。

format:格式化字串。

[argument]...:可選引數,可以是任何型別的資料。

返回值:字串長度(strlen)

相關函式

int   sprintf_s(char  *buffer,size_t  sizeof  buffer, const char *format, [argument] ... );

int   _sprintf_s_l(char  * buffer, size_t  sizeof  buffer,const   char  *format, locale_t   locale ,[argument] ... );

int   swprintf_s(wchar_t  *buffer,  size_t  sizeof  buffer,  const   wchar_t   *format , [argument]...);

int   _swprintf_s_l(wchar_t   *buffer, size_t   sizeof   buffer,  const   wchar_t    *format, locale_t   locale ,[argument]…);

template

int   sprintf_s(char (&buffer)[size],const   char  *format,  [argument] ... ); //僅存在於c++

template

int swprintf_s(wchar_t (&buffer)[size],const   wchar_t    *format ,[argument]...); //僅存在於c++

2,引數說明及應用舉例:

sprintf格式的規格如下所示。中的部分是可選的。

%[指定引數][識別符號][寬度][.精度]指示符

若想輸出`%'本身時, 請使用`%%'處理。

1. 處理字元方向。負號時表示從後向前處理。

2. 填空字元。 0 的話表示空格填 0;空格是內定值,表示空格就放著。

3.字元總寬度。為最小寬度。

4. 精確度。指在小數點後的浮點數字數。

3,轉換字元

%% 印出百分比符號,不轉換。

%c 整數轉成對應的 ascii 字元。

%d 整數轉成十進位。

%f 倍精確度數字轉成浮點數。

%o 整數轉成八進位。

%s 整數轉成字串。

%x 整數轉成小寫十六進製。

%x 整數轉成大寫十六進製。

4,sprintf 是個變參函式,定義如下:

int sprintf( char *buffer, const char *format [, argument] ... );

除了前兩個引數型別固定外,後面可以接任意多個引數。而它的精華,顯然就在第二個引數:

格式化字串上。

printf 和sprintf 都使用格式化字串來指定串的格式,在格式串內部使用一些以「%」開頭的格式說明符(format specifications)來佔據乙個位置,在後邊的變參列表中提供相應的變數,最終函式就會用相應位置的變數來替代那個說明符,產生乙個呼叫者想要的字串。

格式化數字字串

sprintf 最常見的應用之一莫過於把整數列印到字串中,所以,sprintf 在大多數場合可以替代

itoa。

如://把整數123 列印成乙個字串儲存在s 中。

sprintf(s, "%d", 123); //產生"123"

字元/ascii 碼對照

以下程式段把所有可見字元的ascii 碼對照表列印到螢幕上(這裡採用printf,注意」#」與」%x」合用時自動為16 進製數增加」0x」字首):

for(int i = 32; i < 127; i++)

連線字串

char* who = "i";

char* whom = "csdn";

sprintf(s, "%s love %s.", who, whom); //產生:"i love csdn. "

列印位址資訊

有時除錯程式時,我們可能想檢視某些變數或者成員的位址,由於位址或者指標也不過是個32 位的數,你完全可以使用列印無符號整數的」%u」把他們列印出來:

sprintf(s, "%u", &i);

sprintf(s, "%08x", &i);

然而,這些都是間接的方法,對於位址列印,sprintf 提供了專門的」%p」:

sprintf(s, "%p", &i);

利用sprintf 的返回值

較少有人注意printf/sprintf 函式的返回值,但有時它卻是有用的,spritnf 返回了本次函式呼叫最終列印到字元緩衝區中的字元數目。也就是說每當一次sprinf 呼叫結束以後,你無須再呼叫一次strlen 便已經知道了結果字串的長度。如:

int len = sprintf(s, "%d", i);

對於正整數來說,len 便等於整數i 的10 進製位數。

變參函式設計

變參函式的應用得比較少.輸出log資訊功能的函式演常會用到變參函式.什麼是變參函式?比如 printf 個數 d,總數 d a,b printf就是變參函式,因為其引數的個數不是固定的.變參函式一般用到下列巨集 va arg retrieve argument from list va end re...

變參函式剖析

變參函式定義形式如func type a,要求至少乙個固定引數,因為需要通過這個引數來確定究竟有多少個引數 以及引數的型別。windows中,變參函式用來獲取引數的幾個巨集定義如下。typedef char va list define addressof v v define intsizeof ...

變參函式詳解

在呼叫函式時,如果我們希望函式的引數個數是可變的,那麼便需要用到變參函式,既在每次函式呼叫時輸入的引數個數不定。我們需要知道以下兩點 1 函式形參入棧方向為自右向左 2 在乙個程序的記憶體空間中,棧低為高位址,棧頂為低位址。所以我們可以從最後乙個入棧的引數 形參第乙個 根據位址以及棧空間的特點依次找...