funktion zum string manipulieren



  • Hi,

    ich versuche mich gerade an einem Programm, um Text aus einer Datei aus zu lesen und ggf. zu manipulieren. Dabei habe ich eine Funktion geschrieben, die pruefen soll, ob eine Zeile mit Leerzeichen beginnt und es/sie, soweit vorhanden, loescht.

    Hier erstmal die Funktion:

    void removespace(string *fstr)
    {
         string space = " ";
         int pos1;
         while(pos1 != string::npos)
         {
         string::size_type pos1 = (*fstr).find(space);
         (*fstr).erase(pos1,1);
         }
    }
    

    Ich bin Neuling und bekomme daher laufend Fehler beim compilen. Aber diesmal beschwert sich DEV C++ nicht, dafuer bekomme ich aber von Windows eine Fehlermeldung und das Programm rauscht ab. Das passiert nur wenn ich diese Funktion im Laufe des Programms aufrufe, muss also an ihr liegen.

    Ich hatte in einem Tutorial zu Pointern gelesen, dass es eine bessere Moeglichkeit gibt als Pointer bzw. Adressen an Funktionen zu uebergeben. Dort stand dann das ist erstmal nicht wichtig nur kam dann auch nichts mehr dazu. Hat evtl. jemand einen Link zu einem Tutorial fuer eine bessere Methode?

    Waere fuer jede Hilfe dankbar. 🙂



  • Die bessere Methode sind Referenzen. Such mal danach in deinem Tutorial 🙂



  • Es geht dann wohl um Referenzen:

    void removespace(string &fstr) 
    {
    //Dann kann fstr wie ein normaler string benutzt werden, zB: fstr.length()
    }
    

    Du sagst, dass nur Leerzeichen am Anfang entfernt werden sollen, du suchst aber im ganzen string.
    pos1 gibt es zweimal!?
    Der Rückgabewert von find wird nicht korrekt geprüft.



  • Mit Referenzen hat das nichts zu tun!

    @rocco123:
    Hast du mal einen Code angeschaut? Erstmal wird npos nicht initialisiert und der Wert gleich mal fleissig gelesen. Dann wird npos ein Wert zugewiesen und ohne Sicherheitsabfrage, was npos ueberhaupt ist, einfach dort geloescht. Klar das es crashed, sobald npos nicht auf den String zeigt... f'`8k

    Autocogito

    Gruß, TGGC (Was Gamestar sagt...)



  • TGGC schrieb:

    Mit Referenzen hat das nichts zu tun!

    Die "bessere Methode" für die Übergabe an die Funktion hat sehr wohl mit Referenzen zu tun.

    @rocco123:
    Hast du mal einen Code angeschaut? Erstmal wird npos nicht initialisiert und der Wert gleich mal fleissig gelesen. Dann wird npos ein Wert zugewiesen und ohne Sicherheitsabfrage, was npos ueberhaupt ist, einfach dort geloescht. Klar das es crashed, sobald npos nicht auf den String zeigt...

    Ersetze "npos" jeweils durch "pos1" und lass den sinnfreien Rest, der nichts mit dem Thema zu tun hat weg, dann ergibt das ne passende Aussage.



  • Teile des Codes hatte ich aus Tutorials kopiert und dabei voellig aus dem Zusammenhang gerissen, dass die Funktion gar nicht das tut (sofern sie funktioniert) was ich will, sondern jedesmal den ganzen String loescht ist mir jetzt erst aufgefallen. Aber npos ist keine Variable sondern string::npos erhaelt man wenn der substring gar nicht gefunden wurde.



  • Das Thema gab es neulich schon mal, rausgekommen war so etwas:

    #include <algorithm>
    #include <string>
    
    void remove_chars(std::string &these, char to_remove)
    {
      these.erase( std::remove(these.begin(), these.end(), to_remove), these.end() );
    }
    

    Verwendung:

    #include <string>
    
    int main()
    {
      std::string value = "asdfghjklkjhgfdsdfghjklkjhgfdfghjk";
      remove_chars(value, 'j');
    }
    

    bb



  • Wenn nur die Leerzeichen am Anfang entfernt werden sollen:

    void trim_left(std::string& s)
    {
        s.erase(0, s.find_first_not_of(' '));
    }
    


  • Klappt jetzt alles wie es soll 🙂

    Danke euch allen.



  • rocco123 schrieb:

    void removespace(string *fstr)
    {
         string space = " ";
         int pos1;
         while(pos1 != string::npos)
    

    Du benutzt pos1 ohne pos1 initialisiert zu haben.


Anmelden zum Antworten