3

区切り文字を使用して文字列をトークン化するためにメソッドを使用CString::Tokenizeしていますが、奇妙なことに気付きました。文字列内のすべてのトークンを取得したいので、ループ内の文字列でそのメソッドを呼び出します。これが私のコードです:

CString strToken;
for(int nTokenPos = 0; nTokenPos < dialog->myValue.GetLength(); nTokenPos++)
{
   //TRACE( "The Size of the string is %d\n", dialog->myValue.GetLength());
   TRACE( "Iteration No %d\n",nTokenPos);
   strToken = dialog->myValue.Tokenize(_T("X"), nTokenPos);
   strToken+="\n";
   OutputDebugString(strToken);
}

注:dialog->myValueは、トークン化する文字列です。そのコードを「99X1596」(たとえば)でテストすると、出力は次のようになります。

Iteration No 0
99
Iteration No 4
596

別の例: '4568X6547' 出力:

Iteration No 0
4568
Iteration No 6
547

区切り文字「X」の後の最初の文字を無視する理由もわかりません。また、1回の反復をスキップします!

4

1 に答える 1

5

あなたはループで増加nTokenPosします。forそのため、2 番目のトークンが壊れています。CString::Tokenize更新nTokenPosし、次の反復で使用します。

正しい使い方は次のようになります。

CString str = "99X1596";
int curPos = 0;
CString resToken = str.Tokenize(_T("X"), curPos);
while(!resToken.IsEmpty())
{
   // Process resToken here - print, store etc
   OutputDebugString(resToken);

   // Obtain next token
   resToken = str.Tokenize(_T("X"), curPos);
}
于 2012-09-25T10:38:26.147 に答える