MFC基礎--CString的Tokenize()和_tcstok()的用法對比
Tokenize()和_tcstok()都是用來分割字串的方法。但是其各自的使用還是有很多不同。
下面對字串“%s111gdfafd%s\t023232%s\t1%s\t2%s\t3%s\t4%s\t0XFF0000%s\tfdas”用這兩個函式都進行一些相同匹配分割處理,程式碼和結果對比如下:
Tokenize():
#include "stdafx.h" #pragma once
#include <stdio.h>
#include <tchar.h>
#include <vector>
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 從 Windows 頭中排除極少使用的資料
#endif
#include <afx.h>
#include <afxwin.h> // MFC 核心元件和標準組件
#include <iostream>//函式功能:按指定長度擷取字串前面的部分
int _tmain(int argc, _TCHAR* argv[], TCHAR* envp[])
{
CString Seperator = _T(“1%s\t”);
int Position = 0;
CString Token;
TCHAR* szTrunc = new TCHAR[Token.GetLength() + 1]; // 將結果儲存在堆裡 _tcscpy(szTrunc,Token); // 結果拷貝 std::wcout<<szTrunc<< std::endl;Token </span>=<span style="color: rgba(0, 0, 0, 1)"> sBuf.Tokenize(Seperator, Position); </span><span style="color: rgba(0, 0, 255, 1)">while</span>(!<span style="color: rgba(0, 0, 0, 1)">Token.IsEmpty()) { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Get next token.</span> Token = sBuf.Tokenize(Seperator, Position);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">從iStart位置取出字串中含pszTokens分割符間的內容;</span>
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (_tcslen(szTrunc) > <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
{
delete [] szTrunc;
}
}
system(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">pause</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
}
_tcstok():
#include "stdafx.h" #pragma once #include <stdio.h> #include <tchar.h> #include <vector> #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 建構函式將是顯式的
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 從 Windows 頭中排除極少使用的資料
#endif
#include <afx.h>
#include <afxwin.h> // MFC 核心元件和標準組件
#include <iostream>//函式功能:按指定長度擷取字串前面的部分
int _tmain(int argc, _TCHAR* argv[], TCHAR* envp[])
{
CString str = _T("%s111gdfafd%s\t023232%s\t1%s\t2%s\t3%s\t4%s\t0XFF0000%s\tfdas");
TCHAR seps[] = _T(“1%s\t”);
TCHAR* token = _tcstok( str.GetBuffer(), seps );
while( token != NULL )
{
//MessageBox( token, token, MB_OK );
//MessageBox(_T(“dfzdsas”));
std::wcout<<token<<std::endl;
token = _tcstok( NULL, seps );//這一句刪去會導致無限迴圈
}
system(“pause”);
return 0;
}