Nicht mehr als ein Leerzeichen hintereinander...



  • Tja, um das in der Überschrift genannte Ziel zu erreichen, benutze ich folgenden Code:

    while(int loc = name.find( "  ") != string::npos) name.erase(loc, 1);
    

    Aber leider funktioniert das so gar nicht.
    Beispiel Code:

    #include<iostream>
    #include<string>
    using namespace std;
    
    string beautify(string name)
    {
      while(int loc = name.find( "  ") != string::npos)
        name.erase(loc, 1);
      return name;
    }
    
    int main(int argc, char* argv[])
    {
      string db1;
      string db2;
      db1 = "Auto   fahren";
      db2 = beautify(db1);
      cout << db1 << endl << db2 << endl;
      db1 = "   YEAH   ";
      db2 = beautify(db1);
      cout << db1 << endl << db2 << endl;
      return 0;
    }
    

    Ergibt:

    Auto   fahren
    A fahren
       YEAH
    [leere Zeile]
    

    Irgendwelche Ideen?



  • Habe ich das jetzt richtig verstanden?
    Du willst alle Leerzeichen löschen?



  • roan312 schrieb:

    Habe ich das jetzt richtig verstanden?
    Du willst alle Leerzeichen löschen?

    Nein, ich möchte, dass nicht mehr als ein Leerzeichen aufeinmal anzutreffen ist.

    Aus

    Auto   fahren
    

    soll z.B.

    Auto fahren
    

    werden.

    Zu dem Zweck suche ich nach zwei leerzeichen und löche das erste.



  • mmh, probiers mal so

    string beautify(string name)
    {
      while(name.find("  ", 0) != string::npos)
      {
        int loc = name.find("  ", 0);
        name.erase(loc, 1);
      }
      return name;
    }
    


  • Hmmm, da müsste ich mal im Stoustrup nachlesen...
    Ansonsten könntest du auch manuell suchen,
    einfach nach einem Leerzeichen gucken und das nächste Zeichen mitprüfen,
    dann einfach eines der beiden löschen.

    Falls der Fehler überhaupt beim Suchen lag.



  • das ist jetzt aber auf 2 leerzeichen hardgecoded 😞



  • @borg:
    Wow.. das funktioniert. Danke. Aber warum ist das so?



  • masterfox64 schrieb:

    @borg:
    Wow.. das funktioniert. Danke. Aber warum ist das so?

    naja, war nur ins blaue geraten.
    dein

    while(int loc = name.find( "  ") != string::npos)
    

    hat irgend einen seiteneffekt. wahrscheinlich hat er in loc true/false gespeichert, je nachdem was bei dem vergleich rausgekommen ist. das würde deine ausgabe erklären.



  • gib doch einfach mal in der schleife loc aus, wenn er immer 1 ausgibt liegts daran.



  • Interessant:

    #include<iostream>
    #include<string>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
      string name = "a  b  c  d";
      int c = 0;
      while(int loc = name.find("  ", 0) != string::npos)
      {
        c++;
        cout << "Durchlauf Nummer " << c << endl;
        cout << "Lösche Zeichen " << loc << endl;
        cout << "Vorher: " << name << endl;
        cout << "Nacher: " << name.erase(loc, 1) << endl;
      }
      return 0;
    }
    

    ergibt:

    Durchlauf Nummer 1
    Lösche Zeichen 1
    Vorher: a  b  c  d
    Nacher: a b  c  d
    Durchlauf Nummer 2
    Lösche Zeichen 1
    Vorher: a b  c  d
    Nacher: ab  c  d
    Durchlauf Nummer 3
    Lösche Zeichen 1
    Vorher: ab  c  d
    Nacher: a  c  d
    Durchlauf Nummer 4
    Lösche Zeichen 1
    Vorher: a  c  d
    Nacher: a c  d
    Durchlauf Nummer 5
    Lösche Zeichen 1
    Vorher: a c  d
    Nacher: ac  d
    Durchlauf Nummer 6
    Lösche Zeichen 1
    Vorher: ac  d
    Nacher: a  d
    Durchlauf Nummer 7
    Lösche Zeichen 1
    Vorher: a  d
    Nacher: a d
    

    loc wird nicht aktualisiert.



  • doch, loc wird jedesmal wieder auf true(1) gesetzt. bis das erste mal keine 2 leerzeichen mehr drin sind. dann wird loc auf false(0) gesetzt (nach der schleife nochmal ausgeben!) und er beendet die schleife.



  • sonst machs halt so:

    string beautify(string name)
    {
      int loc;
      while((loc = name.find("  ", 0)) != string::npos)
        name.erase(loc, 1);
      return name;
    }
    

    das dürfte auch keine probleme machen.



  • masterfox64 schrieb:

    Interessant:

    while(int loc = name.find("  ", 0) != string::npos)
    

    loc wird nicht aktualisiert.

    Vermutlich arbeitet der Compiler das ganze einfach in der "falschen" Reihgenfolge ab, versuch doch mal ein paar Klammern zu setzen:

    while((int loc = name.find("  ", 0)) != string::npos)
    

    Damit du in int loc nicht das Ergebniss der Boolischen Operation bekommst.

    //Ups, das steht ja schon darüber... 😮 sry


Anmelden zum Antworten