String in verschiedene Begriffe aufspalten



  • Eine Möglichkeit wäre, dass du einen Zähler in die While Schleife einbaust und diesen mit einer if-Abrage überprüfst....

    [edit]
    Satzbau 🙂



  • Vielleicht habe ich mich unglücklich ausgedrückt 🙂
    Wie kann ich angeben das er ab dem ersten bis zum zweiten Komma sucht?

    So wie die Funktion in meinem Code (oben gepostet) steht holt sie nur den ersten Begriff.

    Ich weiß nicht wo ich da ansetzen muss damit er nach dem Komma weitersucht und nicht wieder von vorne 🙂



  • Also ich würde das in einer Klasse oder einer Struktur machen:

    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
    
    struct einheit{
            string roboter;
            string zeit;
            string ort;
    };
    
    int main(int argc, char *argv[])
    {
            stringstream begriff;
            string getrennt;
            int position = 0;
    
            begriff<<"RH-OLA115,10:07:34,Fertigungshalle";
            einheit Einheit;
            while(getline (begriff, getrennt, ',')){
                    Einheit.roboter = getrennt;
                            getline(begriff, getrennt, ',');
                    Einheit.zeit = getrennt;
                            getline(begriff, getrennt, ',');
                    Einheit.ort = getrennt;
            }
            cout << "Einheit: " << Einheit.roboter << endl;
            cout << "Zeit: " << Einheit.zeit << endl;
            cout << "Ort: " << Einheit.ort << endl;
    }
    

    Nur als Denkansatz. Ist mit Sicherheit nicht optimal. Z. B. könnte man mehrere Einheiten in einem Vector speichern, oder die Schleife so basteln, dass beliebig viele Element eingetragen werden können etc......



  • Ja vielen Dank erstmal, es funktioniert einwandfrei 🙂
    Nur ich verstehe noch nicht ganz wie das funktioniert:

    while(getline(begriff, getrennt, ','))
        {
           roboter = getrennt;
           getline(begriff, getrennt, ',');
           zeit = getrennt;
           getline(begriff, getrennt, ',');
           ort = getrennt;
         }
    

    Könntest du evt. beschreiben wie das von statten geht? Ich komm nicht dahinter 😕



  • Im Grunde ist das ja selbsterklärend. Aber frei nach dem Motto "Wenn du was erklären kannst, hast dus auch verstanden" versuch ich mal mein Glück. 🙂

    // Schleife läuft solange, bis das Ende von begriff erreicht ist; 
    // Schreibt den Teil bis zum ersten Komma aus dem sstream "begriff" in den String "getrennt"...
            while(getline (begriff, getrennt, ',')){ 
                    Einheit.roboter = getrennt; // Kopiert den Inhalt von "getrennt" in die Membervariable "roboter" des Objekts "Einheit"
    
                    getline(begriff, getrennt, ','); // Liest bis zum nächsten Komma, überschreibt den alten Inhalt von "getrennt"...
                    Einheit.zeit = getrennt; // Kopiert das zweite Wort in die Membervariable "zeit" des Objekts "Einheit"
    
                    getline(begriff, getrennt, ','); // Liest bis zum nächsten Komma, überschreibt den alten Inhalt von "getrennt"...
                    Einheit.ort = getrennt; // Kopiert das dritte Wort in die Membervariable "ort" des Objekts "Einheit"
    
            }
    

    Ich hoffe, das war verständlich. Wie schon gesagt, wenn du mal Lust hast, kannst du das ja etwas dynamischer machen. Diese Version ist speziell auf dein Problem zugeschnitten, d. h. wenn eine Enheit noch ein zusätzliches Member bekommen würde oder sich die Reihenfolge ändert, müsste der ganze Kram angepasst werden. Aber das nur am Rande. 😃

    Hier noch ein Link:
    www.cppreference.com



  • ahh vielen Dank 🙂 mir war nicht ganz klar wieso er nicht immer wieder das erste wort ausliest, aber jetzt weiß ich bescheid 🙂

    danke!



  • Besser weil um einiges schneller ist sowas:

    string Dispatch_String(string &source,char sep,int pos)
    {
    int x=-1;
    while(pos--) x=source.find(sep,x)+1;
    return source.substr(x,source.find(sep,x)-x);
    }
    


  • Schneller ist nicht unbedigt besser. Dein Code ist unübersichtlich, fehleranfällig und kaum intuitiv zu benutzen.



  • Schneller ist nicht unbedigt besser. Dein Code ist unübersichtlich, fehleranfällig und kaum intuitiv zu benutzen.

    1.An welcher Stelle sollen diese 3 Zeilen unübersichtlich sein ?
    2.Läuft absolut fehlerfrei !
    3.Intuitiv.Übung macht den Meister ... 🙄



  • Wenn du die STL nicht benutzt geht es auch noch schneller.

    string Dispatch_String(string &source,char sep,int pos)
    {
       int prv=0,i=-1;
       while(pos)
       {
          i++;
          if (source[i]==sep)
          {
             pos--;
             if(pos) prv=i+1;
          }
       }
       return source.substr(prv,i-prv);
    }
    

    Ist das für dich übersichtlicher ?



  • Ist das für dich übersichtlicher ?

    Ja.

    Wenn du die STL nicht benutzt geht es auch noch schneller.

    Vermutest du das, oder hast du das getestet? Ist der Geschwindigkeitsvorteil überhaupt relevant?

    1.An welcher Stelle sollen diese 3 Zeilen unübersichtlich sein ?

    int x=-1; <- Was das soll, ist mir nicht wirklich klar

    2.Läuft absolut fehlerfrei

    Mit fehleranfällig mein ich nicht, dass der Code fehlerhaft läuft, sondern dass man nicht erkennen kann, was er tut. Wenn man das debuggen muss, ist es mit Sicherheit komplizierter, als die Lösung mit den Stringstreams.

    3.Intuitiv.Übung macht den Meister ...

    Man kann sich das Leben auch selber schwer machen...

    Solange dein Code funktioniert, der Benutzer weiss, was er tut, Geschwidingkeit von enormer Bedeutung ist und der Geschwindigkeitsvorteil (falls vorhanden) auch enorm ist, kann man das mit Sicherheit benutzen. Dein Code gibt aber auch nur den Teil bis zum ersten Trennzeichen zurück. Was ist mit den Teilen danach?



  • Mit fehleranfällig mein ich nicht, dass der Code fehlerhaft läuft, sondern dass man nicht erkennen kann, was er tut. Wenn man das debuggen muss, ist es mit Sicherheit komplizierter, als die Lösung mit den Stringstreams.

    while(pos--) x=source.find(sep,x)+1;
    

    Solange pos nicht 0 ist setze in x die Position des gefundenen (ab Position x suchen) ',' Trennzeichens + 1.

    Vermutest du das, oder hast du das getestet? Ist der Geschwindigkeitsvorteil überhaupt relevant?

    Getestet.
    Wenn du ständig etwas längere strings auslesen musst (ca 2 MB) und veränderungen der empfangenen strings im Bereich von ms liegen ist Geschwindigkeit immer von Vorteil.

    Dein Code gibt aber auch nur den Teil bis zum ersten Trennzeichen zurück. Was ist mit den Teilen danach?

    Wenn du der Funktion in pos den Wert 2,3,4 usw übergibst bekommst du auch die anderen Teilstrings.

    Man kann sich das Leben auch selber schwer machen...

    Schwer finde ich diesen Code wirklich nicht.Eine Implementation auch nicht.



  • Solange pos nicht 0 ist setze in x die Position des gefundenen (ab Position x suchen) ',' Trennzeichens + 1.

    Man mag drüber diskutieren können, aber ich finde ...

    while(getline (begriff, getrennt, ',')){ ...
    

    ..einfacher zu verstehen. Im Zweifelsfall: www.cppreference.de oder ein C++ Buch deiner Wahl, dort sollte dann etwas über getline stehen.

    Wenn du ständig etwas längere strings auslesen musst (ca 2 MB) und veränderungen der empfangenen strings im Bereich von ms liegen ist Geschwindigkeit immer von Vorteil.

    Wie schon erwähnt, für bestimmte Anwendungsfälle mag die stringstream Version unzureichend sein, allerdings sind 2MB Strings auch alles andere als gängig. Es kommt halt immer auf den Anwendungsfall an.

    Wenn du der Funktion in pos den Wert 2,3,4 usw übergibst bekommst du auch die anderen Teilstrings.

    Muss man aber wissen. Also kannst du ja noch eine Doku zu deiner Funktion schreiben. 😉

    Schwer finde ich diesen Code wirklich nicht.Eine Implementation auch nicht.

    Das ist immer Ansichtssache. Nur ich stelle mir immer die Frage, wieso man dann in C++ statt in C programmieren sollte, wenn man die gebotenen Features eh nicht nutzt.



  • Nur ich stelle mir immer die Frage, wieso man dann in C++ statt in C programmieren sollte, wenn man die gebotenen Features eh nicht nutzt.

    Wenn du in bestimmten Fällen schneller bist, bzw es dir anderweitig Vorteile bringt ist doch gegen reines C nichts einzuwenden.
    Manche Sachen lassen sich schneller in C lösen als mit C++.
    Andersherum möchte man die Funktionalität der STL auch nicht missen.
    C und C++ beissen sich nicht.
    Immer Anwendungsspezifisch.



  • röhrich schrieb:

    Manche Sachen lassen sich schneller in C lösen als mit C++.

    das ist falsch. oder haste ne bestimmte sache im auge, die du mir zeigen möchtest?



  • CarstenJ schrieb:

    Das ist immer Ansichtssache. Nur ich stelle mir immer die Frage, wieso man dann in C++ statt in C programmieren sollte, wenn man die gebotenen Features eh nicht nutzt.

    //wo ist hier der unfug?
    void printStrlen(char* x)
    {
       cout<<string(x).size()<<endl;
    }
    


  • Manche Sachen lassen sich schneller in C lösen als mit C++.

    das ist falsch. oder haste ne bestimmte sache im auge, die du mir zeigen möchtest?

    Von mir falsch formuliert.
    Sollte heissen: Es ist manchmal schneller auf die STL zu verzichten.



  • @Volkard:
    Ich verstehe jetzt nicht, was du damit sagen willst?!



  • @Volkard

    Was spricht gegen die C Version:

    [code]
    void printStrlen(char* x)
    {
    printf("%i",strlen(x));
    }

    Ist ebenfalls nachweisbar um einiges schneller als C++:
    

    void printStrle(char* x)
    {
    cout << string(x).size();
    }
    [cpp]
    Mir igst klar, das du mit deinem Code die Möglichkeiten der string Methoden zeigen wolltest. 😉



  • röhrich schrieb:

    @Volkard
    Was spricht gegen die C Version:
    ...strlen(x)...

    nix. du hast den unfug, nach dem ich gefragt habe, gefunden.


Anmelden zum Antworten