1、格式化字符串
CString s;
s.Format(_T("The num is %d."), i);
2、轉爲 int
轉10進制最好用_ttoi(),它在 ANSI 編碼系統中被編譯成_atoi(),而在 Unicode 編碼系統中編譯成_wtoi()。用_tcstoul()或者_tcstol()可以把字符串轉化成任意進制的(無符號/有符號)長整數。
CString hex = _T("FAB");
CString decimal = _T("4011");
ASSERT(_tcstoul(hex, 0, 16) == _ttoi(decimal));
3、轉爲 char *
3.1 強制類型轉換爲 LPCTSTR,不能修改字符串
LPCTSTR p = s; 或者直接 (LPCTSTR)s;
3.2 使用 GetBuffer 方法
不給 GetBuffer 傳遞參數時它使用默認值 0,意思是:“給我這個字符串的指針,我保證不加長它”。假設你想增加字符串的長度,就必須將你需要的字符空間大小(注意:是字符而不是字節,因爲 CString 是以隱含方式感知 Unicode 的)傳給它。當調用 ReleaseBuffer 時,字符串的實際長度會被重新計算,然後存入 CString 對象中。
必須強調一點,在 GetBuffer 和 ReleaseBuffer 之間這個範圍,一定不能使用你要操作的這個緩衝的 CString 對象的任何方法。因爲 ReleaseBuffer 被調用之前,該 CString 對象的完整性得不到保障。
LPTSTR p = s.GetBuffer();
// do something with p
int m = s.GetLength(); // 可能出錯!!!
s.ReleaseBuffer();
int n = s.GetLength(); // 保證正確
4、分割字符串
4.1 單字符分割
AfxExtractSubString(CString& rString, LPCTSTR lpszFullString, int iSubString, TCHAR chSep = '\n');
CString csFullString(_T("abcd-efg-hijk-lmn"));
CString csTemp;
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 0, '-'); // 得到 abcd
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 1, '-'); // 得到 efg
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 2, '-'); // 得到 hijk
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 3, '-'); // 得到 lmn
分隔符可以隨便指定:
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 0, 'f'); // 得到 abcd-e
4.2 字符串分割
利用CString的Find方法,然後再組成數組。
{
dest.RemoveAll();
int pos = 0;
int pre_pos = 0;
while(-1!= pos ){
pre_pos = pos;
pos = source.Find(division,(pos+1));
dest.Add(source.Mid(pre_pos,(pos-pre_pos)));
}
}
CString source是需要截取的原字符串,
CStringArray& dest 是最終結果的數組
CString division 是用來做分割符的字符串
利用strtok()用來將字符串分割。
C/C++中的Split函數是strtok()其函數原型如下:
char * strtok (char * str, const char * delimiters);
函數說明
strtok()用來將字符串分割成一個個片段。參數str指向欲分割的字符串,參數delimiters則爲分割字符串,當strtok()在參數str的字符串中發現到參數delimiters的分割字符時則會將該字符改爲'\0'字符。在第一次調用時,strtok()必需給予參數str字符串,往後的調用則將參數str設置成NULL。每次調用成功則返回下一個分割後的字符串指針。
返回值
返回下一個分割後的字符串指針,如果已無從分割則返回NULL。
示例-1 /* strtok example */ #include <stdio.h> #include <string.h> int main () { char str[] ="a,b,c,d*e"; const char * split = ","; char * p; p = strtok (str,split); while(p!=NULL) { printf ("%s\n",p); p = strtok(NULL,split); } getchar(); return 0; }
本例中,實現對字符串'a,b,c,d*e"用逗號(,)來作界定符對字符串進行分割。
輸出結果將如下所示:
a
b
c
d*e
因爲delimiters支持多個分割符, 我們將本示例中的語句行
const char * split = ",";
改成 const char * split = ",*"; //用逗號(,)和星號(*)對字符串進行分割
這樣輸出結果將如下所示:
a
b
c
d
e
用STL進行字符串的分割
涉及到string類的兩個函數find和substr:
1、find函數
原型:size_t find ( const string& str, size_t pos = 0 ) const;
功能:查找子字符串第一次出現的位置。
參數說明:str爲子字符串,pos爲初始查找位置。
返回值:找到的話返回第一次出現的位置,否則返回string::npos
2、substr函數
原型:string substr ( size_t pos = 0, size_t n = npos ) const;
功能:獲得子字符串。
參數說明:pos爲起始位置(默認爲0),n爲結束位置(默認爲npos)
返回值:子字符串
實現如下:
- #include <iostream>
- #include <string>
- #include <vector>
- //字符串分割函數
- std::vector<std::string> split(std::string str,std::string pattern)
- {
- std::string::size_type pos;
- std::vector<std::string> result;
- str+=pattern;//擴展字符串以方便操作
- int size=str.size();
- for(int i=0; i<size; i++)
- {
- pos=str.find(pattern,i);
- if(pos<size)
- {
- std::string s=str.substr(i,pos-i);
- result.push_back(s);
- i=pos+pattern.size()-1;
- }
- }
- return result;
- }