Problem mit CString::find()
-
Hallo zusammen,
Ich habe folgende code.
void CTestDlg::SplitInBlock(CString StringToBeSplit,std::vector<CString>& SplitedBlock) { CString strBuffer=StringToBeSplit; CString StrTem=NULL; int iStart=0; int iEnd=0; while(StringToBeSplit.Find(BLOCK_START)>0) { iStart=StringToBeSplit.Find(BLOCK_START); iEnd=StringToBeSplit.Find(BLOCK_END); StrTem=StringToBeSplit.Mid(iStart+1,iEnd-iStart-1); SplitedBlock.push_back(StrTem); strBuffer=strBuffer.Right(strBuffer.GetLength()-iEnd-1); } }while Schleife funktionert nur ein Mal Obwohl BLOCK_START="<" Mehr Fach im String vorhanden sind. Ich finde den Fehler einfach nicht. Kann jemand verraten?
Danke im Voraus.Gruß
S.Mathi
-
Weil Du zwar strBuffer veränderst aber im Kopf der while Schleife StringToBeSplit verwendest.
Warum verwendest Du überhaupt eine Methode, den ursprünglichen String verändert?
CString Find hat doch eine Start Position! Und Warum suchst DU mehrfachnach BLOCK_START?Ungeprüft, aber das sollte genügen! Allerdings gibt es hier keine Behandlung des Fehlerfalles "BLOCK_END fehlt!".
{ int iStart=0; int iEnd=0; while((iStart=StringToBeSplit.Find(BLOCK_START,iEnd))>0) { iEnd = StringToBeSplit.Find(BLOCK_END,iStart); SplitedBlock.push_back(StringToBeSplit.Mid(iStart+1,iEnd-iStart-1)); } }
-
OK. Ich bin mit deinem Vorschlag völlig einverstanden. Ich will jetzt gerne wiesen, ob man so was mit dem CString überhaupt machen kann. Oder Ob ich was grundsätzlich was falsch mache.
Vielen Danke für eure Hilfe!. Ich habe das Code folgende Massen geändert. Trotzdem läuft Schleife nur ein Mal.
Gruß
S.Mathi{ //define BLOCK_START _T("<") //define BLOCK_START _T(">") CString strBuffer="!<Hallo1><Hallo2><Hallo3>$"; CString StrTem=NULL; int iStart=0; int iEnd=0; while(strBuffer.Find(BLOCK_START)>0) { iStart=StringToBeSplit.Find(BLOCK_START); iEnd=StringToBeSplit.Find(BLOCK_END); StrTem=StringToBeSplit.Mid(iStart+1,iEnd-iStart-1); SplitedBlock.push_back(StrTem); strBuffer=strBuffer.Right(strBuffer.GetLength()-iEnd-1); } }
-
Nim das so:
{ #define BLOCK_START _T("<") #define BLOCK_END _T(">") CString strBuffer="!<Hallo1><Hallo2><Hallo3>$"; //Suchstring int iStart=0; //Startvariable int iEnd=-1; //endvariable -1 da sie in der nächsten find um 1 erhöht wird while((iStart=strBuffer.Find(BLOCK_START,iEnd+1))!=-1) //start suchen ergebnis in iStart speichern und testen auf -1=abbruch nichts gefunden { iEnd=strBuffer.Find(BLOCK_END,iStart); //ende suchen SplitedBlock.push_back(strBuffer.Mid(iStart+1,iEnd-iStart-1)); //ausschneiden und rückgegebenen string in vector sichern } }das läuft. Wenn Du in der while ein Test auf Find > 0 machst, so wird die while nur einmal durchlaufen, da bein 2. finden die rückgabe von find auf jeden fall > 0 ist, sofern noch was zu finden ist.
Gruß Matthias
-
Jetzt habe endlich meinen Denkfehler entdeckt.(Mit eurer Hilfe)
Danke
S.mathi