【问题标题】:CString Tokenization IssueCString 标记化问题
【发布时间】:2012-09-25 19:04:22
【问题描述】:

我正在使用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-&gt;myValue 是我要标记的字符串。当我在“99X1596”(例如)上测试该代码时,输​​出为:

Iteration No 0
99
Iteration No 4
596

另一个例子:'4568X6547' 输出:

Iteration No 0
4568
Iteration No 6
547

我不知道为什么它会忽略分隔符“X”之后的第一个字符,它也会跳过一次迭代!

【问题讨论】:

    标签: c++ mfc tokenize


    【解决方案1】:

    您在for 循环中增加nTokenPos。这就是为什么第二个令牌坏了。 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);
    }
    

    【讨论】:

    • 我增加它是因为我想检索字符串中的所有标记
    • 你不需要它,Tokenize 会为你增加它。例如,请参阅更新的答案。
    • @Eslam 没有。只需将输出 放在while 正文的第一行即可。查看更新的示例
    猜你喜欢
    • 2023-03-08
    • 2023-04-06
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 2012-12-10
    • 1970-01-01
    相关资源
    最近更新 更多