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 fahrensoll z.B.
Auto fahrenwerden.
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.
deinwhile(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 dloc 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