先定義幾個以後會用到的變數:cstring str1, str2, str3;
概括說明:
mfc對cstring類的封裝可能的確不如std::string完善,但是也的確不錯,功能也足夠強大,使用上還很體貼。其基本特徵為:
☆cstring類沒有基類。
☆cstring類和lpctstr的關係:msdn上說「cstring objects follow "value semantics." think of a cstring object as an actual string, not as a pointer to a string.」也就是說用的時候除了考慮使用它的成員函式的方式,就把它當作普通的c-style字串來使用就行了。你可以在建構函式中使用lpctstr:
cstring str("hello world!");
可以:str1 = str2; 或者 str1 = 「hello」;
也可以:
str3 = str1 + str2; 或者 str3 = str1 + 「hello」;
當然也可以:
str1 += str2; 或者 str1 += 「hello」;
實際上下列的這些操作符都可以用在cstring物件之間或者cstring和lpctstr物件之間:
==、!=、<、>、<=、>=
自然,將cstring物件強制轉換到lpctstr型別也就應該在情理之中:
lpctstr string = (lpctstr) str1;
☆cstring支援unicode和多位元組字符集(mbcs)。因為其本身是基於tchar的——當然你不要忘了定義編碼方式,如:#define _unicode。
☆cstring支援引用計數。可以通過其成員函式lockbuffe/和unlockbuffer來禁用/啟用引用計數。
◆對於cstring類的成員函式的定義、說明、返回值等形式在此並不贅述,如有此疑問請參閱:
中的相關鏈結。
常用函式和範例:
☆改變大小寫:
cstring::makeupper和cstring::makelower兩個成員函式(不帶引數)能使整個字串變成大/小寫字母。
例: str1 = 「hello」;
str1.makeupper();
afxdump << str1; // 輸出結果是」hello」;
☆反**void cstring::makereverse();
☆從.rc檔案讀入字串:
cstring::loadstring函式把傳入的字串資源id對應的字串讀入到cstring物件中
。如果成功就返回非零值。
bool bresult = loadstring(ids_filenotfound);
☆子串操作
→去掉字串左邊空格:str1.trimleft();
→去掉字串右邊空格:str1.trimright();
→獲得指定位置字元:char a = str1.getat(3); 相應的有cstring::setat函式,修改指定位置字元。
→刪除字串中所有指定字元:
str1 = 「hello test」;
str1.remove(『t』);
afxdump << str1; //輸出」hello es」;
→刪除指定位置指定長度的子串:
str1 = 「hello test」;
str1.delete(3, 2); //第乙個引數為index(從零開始)
//第二個引數是長度
afxdump << str1; //輸出」hel test」;
→清空物件的內容:
void cstring::empty();
→查詢子串:
※cstring::find函式有四個過載,可以進行字元和字串的搜尋,同時還可以指定搜尋的起始位置,並返回第一次查詢到的index。
int find( tchar ch ) const;
int find( lpctstr lpszsub ) const;
int find( tchar ch, int nstart ) const;
int find( lpctstr pstr, int nstart ) const;
※cstring::reversefind是返回字串中最後乙個匹配字元的index,與find函式查詢方向正好相反,可惜只有一種過載:
int reversefind( tchar ch ) const;
※cstring::findoneof查詢的是第乙個與指定字串中任意乙個匹配字元的index。(好像有點繞口,看看例子就明白了)
str1 = 「hello test」;
int j = str1.find(「el」);
afxdump << 「j=」 << j << 「/n」;
int k = str1.find(『e』, 3);
afxdump << 「k=」 << k << 「/n」;
int l = str1.reversefind(『t』);
afxdump << 「l=」 << l << 「/n」;
int m = str1.reversefind(『t』);
afxdump << 「m=」 << m << 「/n」;
int n = str1. findoneof(「stuv」);
afxdump << 「n=」 << n << 「/n」;
輸出結果:
j=1k=7
l=9m=9
n=6→字串截斷:cstring::left、cstring::right函式都只帶乙個引數,並且都返回乙個cstring物件,作用是擷取左/右邊指定長度的子串。cstring::mid函式第乙個引數指定位置,第二個引數指定長度。這幾個都是常用的函式,就不寫例子了
→獲得buffer
經常有人問到cstring物件和char *的轉換問題,除了前面說到的強制轉化,就是用這個了
lptstr getbuffersetlength( int nnewlength );使用返回的指標可以直接修改cstring物件的內容,不過有兩點要注意,一是如果指定長度比原cstring長度短(截斷)請記得在後面補』/0』,二是在呼叫cstring物件的任何其它成員函式前請一定記得releasebuffer,也許不用似乎並沒有出錯,但是說不定就是大隱患的根源。
→cstring::spanexcluding函式
以前回答過乙個把cstring物件分離子串的問題,現在想想,如果當時用這個函式的話,將使多麼的方便。函式原型:
cstring spanexcluding( lpctstr lpszcharset ) const;
它查詢cstring物件中與lpszcharset串中任意匹配的第乙個字元,並返回乙個cstring物件,該物件的內容是原來物件從起始位置到查詢到字元的前乙個字元的部分。這在分離用分割符(逗號空格之類)隔開的子串的時候將十分方便:
str1 = 「hello test」;
str2 = str1.spanexcluding(「 ,」);
afxdump << str2; //輸出」hello」
同時,還有乙個很方便的函式:cstring::spanincluding,函式原型:
cstring spanincluding( lpctstr lpszcharset ) const;
它返回物件中前若干個字元,這些字元都必須在lpszcharset之中:
str1 = 「hello test」;
str2 = str1.spanincluding(「abcdefghijk」);
afxdump << str2; //輸出」h」
→插入子串:用cstring::insert可以插入字元或者字串到指定位置
str1 = 「hello test」;
str1.insert(2,「abcd」);
afxdump << str1; //輸出」heabcdllo test」
→替換:cstring::replace的作用是將原來物件中的所有匹配相替換指定字元/子串。有兩個過載原型:
> int replace( tchar chold, tchar chnew );
int replace( lpctstr lpszold, lpctstr lpsznew );
☆cstring物件的屬性操作:這些都很常用了,簡要說明之
int getlength( ) const; //獲得buffer的長度
bool isempty( ) const; //判斷cstring物件內容是否為空
int compare( lpctstr lpsz ) const; //與lpsz按ascii碼比較
int comparenocase( lpctstr lpsz ) const; //與lpsz按ascii碼比較,忽略大小寫
cstring::format /*用來格式化物件。切記不要把物件本身放到format函式的引數中去了*/
CString 成員函式用法大全
cstring的建構函式 cstring 例 cstring csstr cstring const cstring stringsrc 例 cstring csstr abcdef中文123456 cstring csstr2 csstr cstring tchar ch,int nrepeat ...
Vlookup 函式應用例項
vlookup 查詢值,區域,列序號,邏輯值 f1單元格公式 f1 vlookup e1,a1 c2,3,false 上述公式的意思以 e1 單元格的內容為查詢內容,在a1 c2的範圍內找到e1的值,如果找到就返回選擇範內的第3列,也就是返回了a1 c2範圍的c2單元格的內容。當然了,也可以把查詢的...
JS 建構函式的例項成員和靜態成員
一 例項成員 function star username,userage 例項成員只能通過例項化的物件來訪問 var lxy newstar 姓名 console.log lxy.username 列印結果為 姓名 lxy.usersing 列印結果為 usersing 不能通過建構函式來訪問 c...