c++ CString Tokenize 奇怪的问题
Posted
技术标签:
【中文标题】c++ CString Tokenize 奇怪的问题【英文标题】:c++ CString Tokenize strange issue 【发布时间】:2014-05-29 07:13:28 【问题描述】:我观察到一个奇怪的问题,但无法弄清楚为什么会发生这种情况。非常感谢您对此的任何意见。
这是我的代码:
CString strValue;
strValue = "99\tStop\t";
CString strToken;
int pos = 2;
strToken = strValue.Tokenize(_T("\t"), pos);
cout << strToken;
这将返回正确的“停止”(请注意该行的每个条目都有一个制表符分隔符)
但是,对于输入
strValue = "100\tStart\t"
返回的 strToken 为“0”。
对此有什么想法吗?
【问题讨论】:
我什至不太明白为什么第一个示例有效。strValue = "99 Stop ";
看起来不像有任何 \t
。就算你这么说,也真的不像。为什么不明确写"100\tStart\t"
并检查它?也许源代码格式很奇怪,在一种情况下它实际上是一个 [tab],而在另一种情况下它只是空格。
@luk32,我共享的代码是测试代码,但输入字符串来自我正在阅读的文件。我正在使用记事本++,它显示了一个标签。无论如何,我尝试输入“100\tStart\t”和“99\tStart\t”。它仍然显示 100 的相同问题,但适用于 99。
然后也许做一个实际重现问题的例子,并确保它确实如此。现在看起来您在编写示例时引入了新问题。发布sscce。编辑:好的。就是这样。
@luk32,我尝试使用“100\tStart\t”和“99\tStart\t”。输入 100 有问题,而 99 则没有。
我想现在我明白这背后的原因了。变量“pos”是问题所在。目前它设置为 2,所以它在 2 个数字“99”之后开始,但是当我将它设置为“100”时,它返回我 0,因为之后有一个选项卡。
【参考方案1】:
错误...好的。我认为您观察到的结果是预期的。看完这篇Tokenize.
特别是这部分:CStringT Tokenize( PCXSTR pszTokens, int& iStart ) const;
[...] "在每次调用 Tokenize 时,函数从 iStart 开始,跳过前导分隔符,并返回一个包含当前标记的 CStringT 对象,它是字符串直到下一个分隔符。"
你从位置 2 开始。
"99 Stop "
"100 Start "
012 <-- pos
在pos = 2
的第一种情况下,您从\t
开始并忽略所有前导分隔符并返回字符串直到下一个,即Stop
。在第二种情况下,你从0
开始,下一个字符是一个指定的分隔符,因此你得到从pos = 2
到\t
的字符串,它只有一个字符0
。
谜团解开了。
【讨论】:
是的.. 我会将你的标记为答案。感谢您帮助我。以上是关于c++ CString Tokenize 奇怪的问题的主要内容,如果未能解决你的问题,请参考以下文章
c++ 在使用 tolower 时使用 c 字符串格式化错误