字串格式化輸出

2022-07-21 00:09:17 字數 2502 閱讀 9476

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 函式,具體如下:

1

int 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...