Kurze Frage bezüglich string::erase()



  • Hallo, gerade eben wollte ich folgende Zeile schreiben:

    var ist string.

    var.erase(var.find(';')), was eigentlich alles ab einem semikolon löschen sollte.
    Im Endeffekt hat das aber einen Fehler verursacht und das Programm ist abgestürzt.
    Ich dachte, sollte kein Semikolon enthalten sein würde einfach nichts passieren bei dieser Zeile da find(';') dann string::npos zurückgibt und die Erasefunktion somit von string::npos bis string::npos löscht.

    Mhh, scheinbar ist dieser Fall nicht klar geregelt bei der Erasemethode.
    Ist das so richtig? Oder woran liegt dieser Fehler?



  • kingcools2 schrieb:

    und die Erasefunktion somit von string::npos bis string::npos löscht.

    So sehe ich das auch. Da aber der String nicht string::npos lang ist, kann das ja nicht funktionieren.



  • kingcools2 schrieb:

    Ich dachte, sollte kein Semikolon enthalten sein würde einfach nichts passieren bei dieser Zeile da find(';') dann string::npos zurückgibt und die Erasefunktion somit von string::npos bis string::npos löscht.

    std::npos ist kein gültiger Indexwert und darf daher niemals mit irgend einer Stringfunktion benutzt werden. std::npos dient ausschließlich für Vergleiche, ob z.B. eine Suche erfolgreich war.



  • prinzipiell sollte die Klasse std::string diesen Fall abfangen können.

    aber die Dokumentation sagt folgendes dazu:

    www.cplusplus.com schrieb:

    If the position passed is past the end of the string, an out_of_range exception is thrown.

    also pack einen try/catch-Block drum herum und mach einfach nichts...

    ->

    string var("string ohne semikolon");
    
    try {
    var.erase(var.find(';'));
    }
    catch (const out_of_range &ex) {
        // nichts machen
    }
    

    das sollte in etwa das machen, was du wolltest

    MfG DrakoXP



  • also pack einen try/catch-Block drum herum und mach einfach nichts...

    Also das würde ich nur machen, wenn das wirklich eine absolute Ausnahme ist, dass der String kein Semikolon enthält.
    Ansonsten kann man es doch so machen:

    string a = "ABC;DEF";
    a.erase(find(a.begin(), a.end(), ';'), a.end());
    

    Ist natürlich nicht ganz so kompakt.



  • @std__find:
    damit kann std::string::find immer noch std::npos zurückliefern, falls der string kein Semikolon enthält, womit die Exception trotzdem fliegt.
    Für die Exception reicht es bereits, wenn der erste Parameter von std::string::erase die Grenzen über-/unterschreitet.
    Deine Lösung bringt also effektiv gar nichts.



  • Schau nochmal genau hin: Ich benutze std::find, nicht std::string::find.
    std::find liefert einen Iterator auf das gefundene Element, ansonsten den zweiten übergebenen Iterator - hier a.end().
    std::string::erase kann in der Iteratorversion zwei Iteratoren entgegennehmen, und löscht dann die Elemente dazwischen.
    Wenn also kein Semikolon gefunden wird, steht dort am Ende:
    a.erase(a.end(), a.end())
    und es passiert rein gar nichts.



  • ok sry, so hast du natürlich Recht 🙂



  • vielen dank an euch alle 🙂


Anmelden zum Antworten