CString auflösen



  • habe irgendwie den faden verlogren oder ich
    denke zu kompiziert

    ich habe ein string der folgenes beinhaltet

    CString Text_zusammen = "eins'zwei'drei'vier"
    //das Zeichen ' teilt den String
    CString Text1;
    CString Text2;
    CString Text3;
    CString Text4;
    
    for (int z = 0; z < Text_zusammen.GetLength();z++)//durchläuft die schleife bis Stringende erreicht
            {
            //Black out
            }
    

    ich möchte nun das in

    Variable Text1 der wert >>eins<<
    Variable Text2 der wert >>zwei<<
    Variable Text3 der wert >>drei<<
    Variable Text4 der wert >>vier<< steht

    mit CString::Right, CString::Left, CString::Mid
    komme ich nicht klar Denke **wahrscheinlich viel zu umständlich.

    Kann mir jemand auf die Sprünge helfen

    Vossy**



  • @Vossy

    Ich denke eigentlich auch immer viel zu kompliziert, wills aber mal versuchen 😃

    CString Text_zusammen = "eins'zwei'drei'vier"
    //das Zeichen ' teilt den String
    CString Text1;
    CString Text2;
    CString Text3;
    CString Text4;
    
    int nIndexArray[4];
    int nCounter = 0;
    
    for (int z = 0; z < Text_zusammen.GetLength();z++)
    {
        if ( Text_zusammen.GetAt(z) == "'")
        {
             nIndexArray[nCounter] = z;
             nCounter++;
        }
    }
    
    Text1 = Text_zusammen.Left(nCounter[0]);
    Text2 = Text_zusammen.Mid(nCounter[0]+1, nCounter[1]-nCounter[0]);
    Text3 = Text_zusammen.Mid(nCounter[1]+1, nCounter[2]-nCounter[1]);
    Text4 = Text_zusammen.Mid(nCounter[2]+1);
    

    Kann funktionieren muß aber nicht... ist nicht getestet 😮

    Vielleicht hilft es Dir weiter 😉

    MfG veganza



  • Viel zu kompliziert...

    Darf ich dir noch mal einen Tip geben ?
    Schau dir mal CString::Find an...

    Devil



  • Hallo devil81

    das habe ich aber ich komme da logisch
    gesehen auf keine Lösung

    Ich weiß nicht warum aber hilf mir doch bitte mal

    zu veganza

    Hallo

    du soetwas ähnliches habe ich auch schon versucht aber
    das geht schon deshalb nicht da dies eine Ersetzenfunktion ist

    So etwas ähnliches nehme ich zum verschlüsseln bin Textdateien.

    Auch ( Text_zusammen.GetAt(z) == "'") würde nicht gehen
    Dennoch aber Danke

    Vossy



  • hm, mit Find findest du die stelle an der ein bestimmtes zeichen das erste Mal steht,
    CString::Right und CString::Left wollen wissen wo das Zeichen ist, ab dem getrennt
    wird, klingelts ?

    devil



  • @Vossy

    Nicht so schnell... so funktioniert meine Methode auch ( jetzt ist es getestet ) !!!

    CString Text_zusammen = "eins'zwei'drei'vier"
    //das Zeichen ' teilt den String
    CString Text1;
    CString Text2;
    CString Text3;
    CString Text4;
    
    int nIndexArray[4];
    int nCounter = 0;
    
    for (int z = 0; z < Text_zusammen.GetLength();z++)
    {
        if ( Text_zusammen.GetAt(z) == '\'')
        {
             nIndexArray[nCounter] = z;
             nCounter++;
        }
    }
    
    Text1 = Text_zusammen.Left(nCounter[0]);
    Text2 = Text_zusammen.Mid(nCounter[0]+1, nCounter[1]-nCounter[0]-1);
    Text3 = Text_zusammen.Mid(nCounter[1]+1, nCounter[2]-nCounter[1]-1);
    Text4 = Text_zusammen.Mid(nCounter[2]+1);
    

    Die andere Möglichkeit mit CString::Find() müßte man ca. so realisieren:

    Mit Find nach ' suchen, dann erhält man bis zum gefundenen Index-1 den erste String... wird mittels Left(gefundenerIndex-1) herausgelöst.

    Danach schneidest Du bis zum ersten gefundenen Index den String ab... wird mittels Right(Gesamtstringlänge-Index) realisiert.

    Das machst Du solange, bis nichts mehr gefunden wird !!!

    So will es devil81 tun... IMHO

    MfG veganza

    [ Dieser Beitrag wurde am 16.11.2002 um 22:33 Uhr von veganza editiert. ]



  • nein Tut mir leid nicht wirklich
    Alleine Hier wird nur das erste Zeichen gefunden und dann keines mehr
    obwohl 8 Zeichen dtin sind

    for (z = 0;z<Daten_lesen.Rechen_Variante.GetLength();z++)
                {
    
                    if (Daten_lesen.Rechen_Variante.Find("'",z) == FALSE)
                    {
                        MessageBox("gefunden");
    
                    }
                    else
                    {
    
                        MessageBox("nicht gefunden");
                    }
    
                }
    

    Ich muß mir hier was anderes einfallen lassen

    Gibt es irgendwo im Netz ein Praktisches Beispiel

    Vossy



  • Würde ich so machen:

    CString text("'Eins'Zwei'Drei'Vier'");
        CStringArray arr;
        int old = 0,pos = 0;
    
        while(-1 != (pos = text.Find('\'',pos)))
        {
            arr.Add(text.Mid(old,pos - old));
            old = ++pos;
        }
        if(old < text.GetLength())
            arr.Add(text.Mid(old,text.GetLength() - old));
    


  • @Vossy

    Nachdem Du das erste Zeichen gefunden hast, mußt Du den Ausgangs-String um den gefundenen ersten String abschneiden und in diesem "neuen" String weitersuchen.

    Bsp:

    CString str = "12'34'56'78'90";

    der Find(') liefert 2 zurück

    also ist den erster String von 0. bis zum 1. Zeichen, das 2. Zeichen ist der Trenner.

    Jetzt löscht Du bis Index == 2 von Links her alles.

    str.Right(str.GetLength - 2) // -2 weil das der erste Treffer war

    und suchst in diesem "neuen" String wieder nach dem Trenner usw. usw. usw.

    MfG veganza



  • Hallo Nemesyzz futzt gut und jetzt nehme ich es erst mal
    auseinander denn verstehen möchte ich das ja auch.

    Tut mir leid das es bei mir nicht klick gemacht hat aber ich
    habe die Find Methode ganz falsch verstanden

    Ich danke euch allen für die geduldige hilfe

    mFile.Open(Pfadannahme111 + "\\" + Anmeldename111 + "DBank.rm1", CFile::modeRead,NULL );// öffnen des Files
    
    while (mFile.ReadString(Daten_lesen.Rechen_Variante)) // ist Dateiende erreicht
    {
        int old = 0,pos = 0; // Zählvariablen auf 0 setzen
        CStringArray arr; // Array neu setzen
    
        while(-1 != (pos = Daten_lesen.Rechen_Variante.Find('\'',pos)    {
            arr.Add(Daten_lesen.Rechen_Variante.Mid(old,pos - old));         old = ++pos; //dekrement des Zählers old 
        }
        if(old < Daten_lesen.Rechen_Variante.GetLength   {
    
            arr.Add(Daten_lesen.Rechen_Variante.Mid(old,Daten_lesen.Rechen_Variante.GetLength() - old));
        }
    
            MessageBox(arr[4]);
    
    }
    
        mFile.Close();
    

    Danke
    Vossy


Anmelden zum Antworten