一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

VC中字符串取子串總結(jié)

 筆錄收藏 2012-07-20
最近變成中經(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),這里就不再贅述。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    亚洲精品有码中文字幕在线观看| 色婷婷在线视频免费播放| 国产高清精品福利私拍| 极品少妇一区二区三区精品视频 | 黄色三级日本在线观看| 大香蕉久久精品一区二区字幕| 成年人黄片大全在线观看| 日韩欧美中文字幕av| 日韩性生活片免费观看| 亚洲天堂男人在线观看| 国产精品成人免费精品自在线观看| 夜夜嗨激情五月天精品| 精品国产亚洲区久久露脸| 国产av一区二区三区久久不卡| 九七人妻一区二区三区| 国产av熟女一区二区三区蜜桃| 不卡免费成人日韩精品| 中文字幕日韩欧美一区| 国产99久久精品果冻传媒| 国产成人国产精品国产三级| 国产成人精品在线播放| 欧美欧美日韩综合一区| 午夜福利网午夜福利网| 国产老熟女超碰一区二区三区| 久热青青草视频在线观看| 蜜桃av人妻精品一区二区三区| 国产又粗又长又大的视频| 日韩成人午夜福利免费视频| 亚洲精品欧美精品一区三区| 亚洲av熟女一区二区三区蜜桃| 激情五月综五月综合网| 人妻巨大乳一二三区麻豆| 一区二区欧美另类稀缺| 九九热最新视频免费观看| 成人午夜爽爽爽免费视频| 国产亚洲系列91精品| 欧美一级片日韩一级片| 国产精品不卡高清在线观看| 国产精品一区二区三区激情| 午夜福利精品视频视频| 高中女厕偷拍一区二区三区|