从字符串串中提取信息

就先介绍几个函数吧

 关于截取字符串的两个函数CString::Tokenize()和AfxExtractSubString() 

 

 

CString::Tokenize()和AfxExtractSubString()这两个函数都用来截取特定分隔符的字符串,其中有些区别值得注意。

 CStringT Tokenize(PCXSTR pszTokens, int& iStart) const;

BOOL AFXAPI AfxExtractSubString(CString& rString, LPCTSTR lpszFullString, int iSubString, TCHAR chSep = '/n');

CString::Tokenize()中的PCXSTR pszTokens为分隔字符的组合,可为多个字符。int& iStart是开始位置,函数运行后会发生变化。

AfxExtractSubString()中的TCHAR chSep为分隔字符,只能是一个字符。

另外有一点要注意:

CString::Tokenize()碰到连续多个分隔字符是作为一个处理的,AfxExtractSubString()中多个分隔符可区分处理。

_tcstok函数的使用

char* _tcstok( char* strToken, const char* strDelimit );
该函数是可以从一个CString串中,根据提供的分隔符,截取并返回一个一个的Token;
参数:
strToken: 是一个要分析的串;这个串中包含一个或者多个Token,当然还有分隔符,也有可能有其他的字符;
strDelimit: 是分隔符;根据分隔符把strToken中的Token分析出来;

说明:
// Get the first value
pTChar = _tcstok( pstr, _T("; ,") );
nValue = _ttoi( pTChar );
vValue.push_back( nValue );
nIndex++;
// Loop for the other value
while (( pTChar != NULL ) && ( nIndex < 4 ))
{
    pTChar = _tcstok( NULL, _T("; ,") );
    nValue = _ttoi( pTChar );
    vValue.push_back( nValue );
    nIndex++;
}
第一次调用的时候,函数会忽略出现在strToken串开始的分隔符,返回找到的Token指针,用空字符(NULL character )替换掉已经查找到的部分(包括分隔符)并把“新”串保存到一个Static变量中(系统来完成);
如果下次调用时第一个参数为NULL的话,函数从Static变量中取出串,根据分隔符得到并返回新Token,用空字符(NULL character )替换掉已经查找到的部分(包括分隔符)并重新保存“新”串;
如此循环,直到循环条件结束。

可以编写一个小程序,在Debug状态下进行单步跟踪,查看其调用过程。

 

 其实它们的功能都差不多 以下是我做的例子

CAtlString str(_T("Pos: 144.5s   2166f (57%) 55.77fps Trem:   0min   9mb  A-V:0.000 [235:67]"));
 CAtlString resToken;
 int curPos = 0;

 resToken= str.Tokenize(_T("()"),curPos);
 while (resToken != _T(""))
 {
    resToken = str.Tokenize(_T("()"), curPos);
    if(resToken.GetLength()<5&&resToken.GetLength()>1)MessageBox(resToken);
 }

这段代码就是取这个字符串中的百分数

 

你可能感兴趣的:(从字符串串中提取信息)