Nicht mehr als ein Leerzeichen hintereinander...
-
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