最近變成中經(jīng)常用到字符串處理操作, 其中最多的就是從字符串中取子串了。 今天正好看到這樣一個(gè)帖子,總結(jié)的不錯(cuò), 引進(jìn)過來。 ------------------ 一。前言 程序中經(jīng)常會(huì)遇到要處理用某些符號(hào)(如空格,或“, ; . | \t”等)分隔的字符串的問題,我在此做了一些總結(jié)和比較。 二。處理方法 1. 用MFC CString之Find處理字符串 // 以下方法將一個(gè)字符串分解后放到一個(gè)CStringArray中: void ExtractString(CStringArray& arr, const CString strSrc, const CString sep = "\r\n" ) { // 預(yù)處理: 可根據(jù)需要決定是否需要Trim,以及是Trim掉空格/還是分隔符/還是其它 CString str(strSrc); str.TrimLeft(); str.TrimRight(); if(str.IsEmpty()) return; // 開始分解 int pos = str.Find(sep); while (pos != -1) { //if(!str.Left(pos).IsEmpty()) // 如有必要也可在此Trim后再判斷是否為空,為空則舍棄 arr.Add(str.Left(pos)); str = str.Mid(pos + sep.GetLength()); pos = str.Find(sep); } arr.Add(str); // think } // BTW,CString提供了TrimLeft和TrimRight,卻不能一次TrimAll,并返回Trim后的字符串,我寫了一個(gè): CString TrimAll(CString str, CString strTrim = " ") { str.TrimLeft(strTrim); str.TrimRight(strTrim); return CString(str); } // 同樣是用Find處理字符串,和以上處理方式稍有不同,試比較: void ExtractString2(CStringArray& arr, const CString strSrc, const CString sep = "\r\n" ) { CString str(strSrc); if(TrimAll(str).IsEmpty()) return; // 開始分解 int pos = str.Find(sep); if(pos == -1) // 未找到分隔符 arr.Add(str); else // 找到分隔符 { str += sep; // think CString s; while (pos != -1) { s = str.Left(pos); if(!TrimAll(s).IsEmpty()) arr.Add(s); str = str.Mid(pos + sep.GetLength()); pos = str.Find(sep); } } } 2. 用MFC未公開函數(shù)AfxExtractSubString 處理 // 以下為函數(shù)定義及說明: // AfxExtractSubString 從一個(gè)字符(chSep)分隔的字符串(lpszFullString)中取出第iSubString個(gè)子串,輸出到rString BOOL AFXAPI AfxExtractSubString ( CString& rString, // 用于輸出子串 LPCTSTR lpszFullString, // 被分隔的字符串 int iSubString, // zero-based substring index TCHAR chSep = '\n' // 分隔符 ) // eg: CString sDesc= "張三|男|28|醫(yī)生"; CString sOccupation; if(AfxExtractSubString ( sOccupation, sDesc, 3, '|')) cout << "職業(yè):" << sOccupation << endl; 3. 用C語言之strtok函數(shù)處理 #include <assert.h> void test() { char* str = "06317377244|13805871280|20040210105049|193|NBGW1|040C|0017|8"; char seps[] = ",;|"; char* temp = (char*)malloc(sizeof(char) * (strlen(str)+1)); strcpy(temp, str); char* token = strtok(temp, seps); while (NULL != token) { printf("%s\t", token); token = strtok(NULL, seps); } free(temp); } 4. 其它方法 當(dāng)然既然能用MFC的Find函數(shù)進(jìn)行處理,也可能string的find處理,甚至可用最原始的字符比較,再配合一些字串處理函數(shù)進(jìn)行處理。 但我覺得我提供的使用Find類函數(shù)處理字串的2種方法非常常用,可供參考。 三。比較 處理方法 優(yōu) 劣 用MFC CString之Find處理字符串 分隔符可是是字符或字串; 在MFC中是最常用的方法。 僅限于MFC中使用 用AfxExtractSubString 處理 完全封裝,調(diào)用簡單; 分隔符可是是字符或字串。 僅限于MFC中使用,且未公開; 一般用于取其中某個(gè)子串。 用C語言之strtok函數(shù)處理 分隔符可以同時(shí)指定多個(gè)字符,可用于分隔符不是很確定的情況。 分隔符只能是字符; C庫函數(shù),在C兼容開發(fā)環(huán)境中通用。 四。后記 以上只是我從個(gè)人的角度做的一個(gè)小結(jié)(我用MFC/C++多一些),難免有失偏頗,在BCB/Delphi中肯定也有對(duì)應(yīng)的方式方法,不在本文的討論范圍內(nèi),這里就不再贅述。 |
|