只要有 "\t"
(制表符空格)字符,我就会尝试将 CString
一分为二。这是我正在使用的代码:
CString val = data->str;
CString valTok;
CString accTok;
int indx = 0;
valTok = val.Tokenize(_T("\t"), indx);
++indx;
accTok = val.Tokenize(_T("\t"), indx);
它很棒,但是缺少 accTok
的第一个字符。例如,当 val = "String1\tString2"
时,valTok = "String1"
但 accTok ="tring2"
... 怎么来的?
编辑:
所以按照 hvd 的建议,我删除了 indx
增量,并且我有以下代码:
CString val = ((CItemData*)lpDrawItemStruct->itemData)->str; // Was this value causing the problem in the end
CString valTok;
CString accTok;
int indx = 0;
valTok = val.Tokenize(_T("\t"), indx);
accTok = val.Tokenize(_T("\t"), indx); // ASSERT(iStart >= 0) fails
但现在第一个 Tokenize
出于某种原因返回 -1
..!有什么想法吗?
已解决:
问题出在传递给 val
的值中:
((CItemData*)lpDrawItemStruct->itemData)->str
有时为 NULL
,在某些情况下第二次调用 Tokenize
时会导致断言。
最佳答案
丢失++indx
。
来自 CStringT::Tokenize 的文档:
The value of iStart is updated to be the position following the ending delimiter character, or -1 if the end of the string was reached.
在第一次调用Tokenize
之后,indx
已经指向了'\t'
,它已经指向了' “String2”的 S'
。通过递增 indx
,它将指向 t
。
这是对 Tokenize
的简单健全性检查:
CString val;
CString str1, str2, str3;
int indx;
val = _T("");
indx = 0;
str1 = val.Tokenize(_T("\t"), indx);
assert(str1 == _T("") && indx == -1);
val = _T("String1");
indx = 0;
str1 = val.Tokenize(_T("\t"), indx);
assert(str1 == _T("String1") && indx >= 0);
str2 = val.Tokenize(_T("\t"), indx);
assert(str2 == _T("") && indx == -1);
val = _T("String1\tString2");
indx = 0;
str1 = val.Tokenize(_T("\t"), indx);
assert(str1 == _T("String1") && indx >= 0);
str2 = val.Tokenize(_T("\t"), indx);
assert(str2 == _T("String2") && indx >= 0);
str3 = val.Tokenize(_T("\t"), indx);
assert(str3 == _T("") && indx == -1);
你得到不同的结果吗?
关于c++ - 使用 Tab Space 字符标记 CString 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12568920/