0

(タブスペース)文字CStringがあるときはいつでも、aを2つに分割しようとしています。"\t"これは私が使用しているコードです:

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 

これは、場合によっては 2 回目のNULL呼び出し時にアサーションを引き起こすことがありTokenizeました。

4

1 に答える 1

3

を失う++indx

CStringT::Tokenizeのドキュメントから:

iStartの値は、終了区切り文字の次の位置に更新されるか、文字列の末尾に到達した場合は -1 になります。

への最初の呼び出しの後、はすでに を超えてポイントしておりTokenize、すでに"String2"の をポイントしています。をインクリメントすることで、 を指します。indx'\t''S'indxt

の簡単な健全性チェックは次の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);

異なる結果が得られますか?

于 2012-09-24T16:20:43.967 に答える