c 語言中提供了一些基本字串格式化處理函式,包括:
1)puts("this is a string"); 簡單輸出字串到 standard output 中,該函式只有多位元組版本;
2)int len = printf("1 + 2 = %d", 1 + 2); 格式化輸出字串到 standard output 中,返回值表示輸出字串長度,其 unicode 版本為 wprintf(const wchar_t *_format, ...);
3)int len = sprintf(szbuffer, "1 + 2 = %d", 1 + 2); 格式化輸出字串到 szbuffer 中,返回值表示輸出字串長度,其中 szbuffer 定義:char szbuffer[1024];
4)當需要自己構造 printf-like 格式函式,可以借助 vsprintf 函式,具體如下:
1int mymessagebox (char* szcaption, char*szformat, ...)
2
va_list 儲存了函式引數棧第乙個可變引數指標,結合格式化字串 szformat 給出每個格式化資料型別,vsprintf 訪問每乙個引數,完成格式化工作。這是可變引數函式工作原理。具體解析如下:
a. 定義 typedef char *va_list;
b. va_start (parglist, szformat) ;語句使 parglist 指向第乙個可變引數,szformat 給出第乙個可變引數前乙個引數位置;
c. type va_arg(va_list ap, type);語句取出下乙個可變引數值,其中 type 指定該可變引數型別;在以上**中 vsprintf 內部完成了該工作;
d. va_end (parglist) ; 語句關閉 parglist 指標,保持程式健壯性;
以上方法實現可變引數訪問,在函式呼叫中,函式引數從右到左入棧。只要直到其中任意乙個引數位置,可以根據引數位置以及引數型別訪問到任意乙個引數。下面構造乙個簡單的可變引數訪問函式以說明其原理:
1//agrc 表示可變引數個數,可變引數型別均為整數
2void arganalyze(int
argc, ...)
311 }
5) sprintf, vsprintf 函式存在一些缺陷,當傳入 buffer 空間小於格式化字串空間時,函式會覆蓋鄰近區域,可能導致程式異常錯誤。因此,微軟特別定義了一些安全函式:_snprintf, _vsnprintf,通過增加傳入空間引數來避免該錯誤。同時,微軟也給出了對應的 windows 版本函式,基本與c庫版本一致。以下給出 sprintf, vsprintf 相關的安全版本, unicode 版本以及通用版本:
ascii wide-character generic
standard version sprintf swprintf _stprintf
safe version _snprintf _snwprintf _sntprintf
windows version wsprintfa wsprintfw wsprintf
standar version vsprintf vswprintf _vstprintf
safe version _vsnprintf _vsnwprintf _vsntprintf
windows version wvsprintfa wvsprintfw wvsprintf
在 c++ 庫中,也提供了相應的字串格式化輸出,具體如下:
1//輸出到 standart output(多位元組版本)
2 std::cout<<"
1 + 2 =
"<<1 + 2
5 std::wcout<"
1 + 2 =
"<<1 + 2
8std::stringstream ss;
9 ss<<"
1 + 2 =
"<<1 + 2
<10 std::string s =ss.str();
1112
//輸出到字串中(寬位元組版本)
13std::wstringstream wss;
14 wss<"
1 + 2 =
"<<1 + 2
<15 std::wstring ws = wss.str();
參考資料 programming windows by charles petzold
字串格式化輸出
你好 info s name s age s salary s name,name,age,job s 也可以換成 d s代表 string d 代表只能接受數字 他的作用是幫助你檢測輸入的資料型別 還有乙個 f 代表的是浮點小數 注意 s點位符要和括號裡的位數相等 msg 這個地方是不顯示的 na...
字串格式化輸出
我們格式化構建字串可以有3種方法 1 元組佔位符 m python astr i love s m print astr 2 字串的format方法 m python astr i love format python m print astr 3 字典格式化字串 m python astr i l...
字串格式化輸出
格式化字串時,python使用乙個字串作為模板 模板中有格式符 這些格式符為真實值預留位置,並說明真實數值應該呈現的格式。python用乙個tuple將多個值傳遞給模板,每個值對應乙個格式符。比如下面的例子 print i m s.i m d year old vamei 99 上面的例子中,i m...