String zerlegen. Bitte um hilfe :-)



  • irgendwie stecke ich in meinem code fest. ich versuche einen komplexen string zu zerlegen. als schneidepunkt nehme ich das ";". schaut euch bitte mal meinen code an. ich verstehe nicht warum es nicht tut. der string wird völlig falsch zerlegt...

    void __fastcall TForm1::AccountClick(TObject *Sender)
    {
        char c;
        int Object = 0;
        int Pos = 4;
        int Count = 0;
        int x = Account->Selected->Index;
        String Tmp = aString[x];
        while(c != '!')
        {
            if(Tmp.SubString(Count,1) != ";")
            {
                Count++;
            }
            else
            {
                Object++;
                switch(Object)
                {
                    case 1:
                    Benutzername->Text = Tmp.SubString(Pos,Count);
                    Pos = Count;
    
                    case 2:
                    Passwort->Text = Tmp.SubString(Pos,Count);
                    Pos = Count;
    
                    case 3:
                    Server->Text = Tmp.SubString(Pos,Count);
                    c = '!';
                }
            }
        }
    }
    


  • Ich weiß nicht ob ich den Code richtig verstehe. Liege ich denn richtig in der Annahme, dass das Programm hängen bleibt, wenn ein Semikolon gefunden wurde?

    Wenn ja, dann musst du Count++ außerhalb der if...else - Schleife schreiben, sonst sorry.

    ...
    if(Tmp.SubString(Count,1) == ";")
    {
                Object++;
                switch(Object)
                {
                    case 1:
                    Benutzername->Text = Tmp.SubString(Pos,Count);
                    Pos = Count;
    
                    case 2:
                    Passwort->Text = Tmp.SubString(Pos,Count);
                    Pos = Count;
    
                    case 3:
                    Server->Text = Tmp.SubString(Pos,Count);
                    c = '!';
                }
            }
    }
    
    Count ++;
    
    ...
    

    eine (nicht unbedingt ideale) Möglichkeit, die ich benutze um einen String zu zerlegen wäre, das Semikolon durch "\n" zu ersetzen dann diesen einem TStringList zuzuweisen.

    Beispiel:

    AnsiString text="asdf;fghj;ghjk;hjkl";
    text = StringReplace(text, ";", "\n", TReplaceFlags() << rfReplaceAll );
    TStringList *strlst = new TStringList();
    strlst->SetText( text.c_str() );
    for (int i=0; i<strlst->Count; i++)
        MessageBox( srtlst->Strings[i] );
    

    [ Dieser Beitrag wurde am 04.07.2003 um 20:42 Uhr von bIce editiert. ]



  • Vielleicht so:

    AnsiString AS;
      TStringList *SL=new TStringList;
      AS="Erster;Zweiter;Dritter;String";
      while (AS.AnsiPos(";")>0)
      {
        SL->Add(AS.SubString(1,AS.AnsiPos(";")-1));
        AS=AS.SubString(AS.AnsiPos(";")+1,AS.Length());
      }
      if (AS.Length()>0)
        SL->Add(AS);
      //in SL stehen alle Eintraege ueber Index abrufbar drin
      //koennen beliebig verarbeitet werden VOR DELETE SL!
    
      delete SL;
    


  • Liege ich denn richtig in der Annahme, dass das Programm hängen bleibt, wenn ein Semikolon gefunden wurde?

    Nein.

    Nun, ich möchte ja eigentlich gerne meine version behalten ;). ich denke das problem ist count/index bei den SubStrings. irgendwie mache ich da was falls? kann das nicht schnell jemand testen/compilieren?



  • 1: Am Ende JEDEN Cases MUSS ein break;
    2: NACH switch{} muss Count++;
    Das gefundene ";" muss uebersprungen werden!
    3: Wieso steht Pos am Anfang auf 4?
    4: Wieso schneidest Du 'Count'- Bytes aus dem String
    5: Stringvergleich sollte mit AnsiCompareIC gemacht werden!!!
    .
    .

    PS: Machs mit ner StringList!


Anmelden zum Antworten