字串
格式化命令
,主要功能是把格式化的資料寫入某個
字串中。
由於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 在乙個程序的記憶體空間中,棧低為高位址,棧頂為低位址。所以我們可以從最後乙個入棧的引數 形參第乙個 根據位址以及棧空間的特點依次找...