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&amp; iStart ) const; [...] "在每次调用 Tokenize 时,函数从 iStart 开始,跳过前导分隔符,并返回一个包含当前标记的 CStringT 对象,它是字符串直到下一个分隔符。"

你从位置 2 开始。

"99  Stop    "
"100  Start  "
 012  <-- pos

pos = 2 的第一种情况下,您从\t 开始并忽略所有前导分隔符并返回字符串直到下一个,即Stop。在第二种情况下,你从0开始,下一个字符是一个指定的分隔符,因此你得到从pos = 2\t的字符串,它只有一个字符0

谜团解开了。

【讨论】:

是的.. 我会将你的标记为答案。感谢您帮助我。

以上是关于c++ CString Tokenize 奇怪的问题的主要内容,如果未能解决你的问题,请参考以下文章

CString 格式返回奇怪的字符

c++ 在使用 tolower 时使用 c 字符串格式化错误

MFC 的 CString 的奇怪行为

直接在 swscanf 中使用 CString 的奇怪行为

tokenize($s) 和 tokenize($s, ' ') 一样吗?

Python re.split() vs nltk word_tokenize 和 sent_tokenize