C 字串完全指南 2 總結

2021-04-13 00:41:09 字數 2657 閱讀 6368

c++字串完全指南(2) - 總結

翻譯:連波

字串類的列印格式函式

對字串包裝類使用printf()或其它類似功能的函式時要特別小心。包括sprintf()函式及其變種,以及trace 和atltrace 巨集。它們的引數都不做型別檢驗,一定要給它們傳遞c語言字串,而不是整個string物件。

例如,要向atltrace()傳遞乙個_bstr_t 裡的字串,必須顯式用(lpcstr)或 (lpcwstr)進行強制型別轉換:

_bstr_t bs = l"bob!";

atltrace("the string is: %s in line %d/n", (lpcstr) bs, nline);

如果忘了用強制型別轉換,直接把整個 _bstr_t 物件傳遞給atltrace,跟蹤訊息將輸出無意義的東西,因為_bstr_t 變數內的所有資料都進棧了。

所有類的總結

常用的字串類之間的轉換方法是:將源字串轉換為c型別字串指標,然後將該指標傳遞給目標類的建構函式。下面列出將字串轉換為c型別指標的方法,以及哪些類的建構函式接受c型別指標。

class

string

type

convert to char*?

convert to constchar*?

convert towchar_t*?

convert to constwchar_t*?

convert tobstr?

construct from char*?

construct fromwchar_t*?

_bstr_t

bstr

yes, cast1

yes, cast

yes, cast1

yes, cast

yes2

yes

yes

_variant_t

bstr

no

no

no

cast to

_bstr_t3

cast to

_bstr_t3

yes

yes

string

mbcs

no yes,c_str()

method

no no

no yes

no wstring

unicode

no no

no yes,c_str()

method

no no

yes

ccombstr

bstr

no

no

no

yes, cast

tobstr

yes, cast

yes

yes

ccomvariant

bstr

no

no

no

yes4

yes4

yes

yes

cstring

tchar

no6in mbcs

builds, cast

no6in unicode

builds, cast

no5yes

yes

colevariant

bstr

no

no

no

yes4

yes4

in mbcs builds

in unicode builds

附註:

雖然 _bstr_t 可以轉換為非常量指標,但對內部緩衝區的修改可能導致記憶體溢位,或在釋放bstr時導致記憶體洩露。

bstr_t 的bstr內含 wchar_t* 變數,所以可將const wchar_t* 轉換到bstr。但這個用法將來可能會改變,使用時要小心。

如果轉換到bstr失敗,將丟擲異常。

用changetype()處理variant的bstrval。在mfc,轉換失敗將丟擲異常。

雖然沒有bstr的轉換函式,但allocsysstring()可返回乙個新的bstr。

用getbuffer()方法可臨時得到乙個非常量tchar指標。

字串總結2

char 和 int,float 等的格式化轉換 從字串中提取指定型別數字或子串,這種情形也是非常的常見。大部分的情形都可以用sscanf 和sprintf 這兩個函式來實現,如果要求複雜,那麼就用正則庫或自己手寫。乙個例子如下 include include include int main 從字...

補充 C 字串完全指引

寫了n年程式,近來在字串上栽了。認真的研究了一些關於字串的文章,在此記下。許多關於字串的問題,在文章最後的參考文章中,相信有更加深入和精確的描述。不過關於中文的處理,我想先補充一些自己的看法。背景 win32 console程式,使用printf輸出字串。相信許多人都有使用過。平台 visualst...

C 字串完全指引 htm

寫了n年程式,近來在字串上栽了。認真的研究了一些關於字串的文章,在此記下。許多關於字串的問題,在文章最後的參考文章中,相信有更加深入和精確的描述。不過關於中文的處理,我想先補充一些自己的看法。背景 win32 console程式,使用printf輸出字串。相信許多人都有使用過。平台 visualst...