Problem mit AnsiString.substring



  • Hallo zusammen, ich habe folgenden Code

    void TGrimmForm::SegmentateString(AnsiString data)
    {
    	substrings.clear();
    	int readpointer = 1;
    	int startpos = -1;
    	int stoppos = -1;
    	while (readpointer < data.Length()) {
    		startpos = -1;
    		stoppos = -1;
    		for (int i = readpointer; i <= data.Length(); i++) {
    			if (((data[i] > 64) && (data[i] < 91)) || ((data[i] > 97) && (data[i] < 123))) {
    				 startpos = i;
    				 readpointer = i;
    				 break;
    			}
    		}
    		for (int i = readpointer; i <= data.Length(); i++) {
    			if (data[i] == '\n') {
    				 stoppos = i;
    				 readpointer = i;
    				 break;
    			}
    		}
    		if ((startpos != -1)&& (stoppos != -1)) {
    			AnsiString substring;
    			substring = data.SubString(startpos, stoppos);
    			substrings.push_back(substring);
    		}
    		readpointer++;
    	}
    }
    

    ich rufe nun die Funktion folgendermassen auf:

    SegmentateString("c00      10        5        5        0        0        0        0        0 \n c01       0        0        0        0        0        0        0        0 \n c02       0        0        0 ");
    

    bei ersten durchlaufen der while Schleife wird auch

    substring = "c00      10        5        5        0        0        0        0        0 \n"
    

    wie erwartet gefunden, beim zweiten Durchlauf wird startpos = 78 und stoppos = 153 gefunden, es wird aber in substring = data.SubString(startpos, stoppos); der komplette Reststring

    "c01       0        0        0        0        0        0        0        0 \n c02       0        0        0 "
    

    eingetragen.

    Woran kann das liegen?

    Gruss Lodo2609



  • Alternativer Lösungsansatz (für BCB6 und neuer):

    String data = "c00      10        0        0        0 \n c01       0        0        0        0        0 \n c02       0        0        0 ";
    TStringList *list = new TStringList();
    list->StrictDelimiter = true;
    list->Delimiter = '\n';
    list->DelimitedText = data;
    Memo1->Lines = list;
    delete list;
    


  • noch einfacher:

    String data = "c00      10        0        0        0 \n c01       0        0        0        0        0 \n c02       0        0        0 ";
    TStringList *list = new TStringList();
    list->Text = data;
    Memo1->Lines = list;
    Label1->Caption = IntToStr(list->Count);
    delete list;
    

    @Jansen
    StrictDelimiter kennt mein BCB6Pro nicht


Anmelden zum Antworten