Space löschen ?
-
;)Hmmm

'remove' : Funktion akzeptiert keine 3 Parameter !!!
P.S. ich dachte ich könnte das nur mit erase ohne remove regeln .
mfg
SH
-
Du kannst auch erase() die Position übergeben, die es löschen soll:
if(s[i]==' ') s.erase(i);(aber daß remove() keine drei Parameter akzeptieren sollte, halte ich für ein Gerücht - hast du auch alle benötigten Header eingetragen?)
PS: Wenn es dir darum geht, mehrfach vorkommende Leerzeichen zu kürzen, könnte auch unique() die richtige Lösung sein:
bool both_space(char c1,char c2) { return c1==' ' && c2==' '; } ... s.erase(unique(s.begin(),s.end(),both_space),s.end());
-
Hi,
remove() erledigt für Dich das FINDEN der Positionen (und das "Aufrücken" der nachfolgenden Zeichen - das würde erase() aber auch machen).
hmmm also bei mir (gcc) funktioniert der Code tadellos ...
Gruß,
Simon2.
-
@CStoll
Also mein Code sieht jetzt so aus :#include<iostream> #include<fstream> #include<string> #include <algorithm> using namespace std; int main() { ifstream f; string s; s ="test string Trallala Hoppsasa"; for (int i = 0 ; i < s.length(); i++) { if(s[i]==' ') s.erase(i); } cout << s << endl; return 1; }Das Einlesegedöns hab ich weggelassen, es geht ja nur um den String !
Es wird aber nur noch test ausgegeben der Resr fehlt !?? Aber diese Version von Dir finde ich am besten !;)@Simaon2
Ich guch nochmal im Studio !mfg
SH
-
Schau Dir mal die verschiedenen Overloads von erase() an:
iterator erase( iterator loc ); iterator erase( iterator start, iterator end ); string& erase( size_type index = 0, size_type num = npos );Dann kommst Du vielleicht drauf, welches bei Deinem Code aufgerufen wird....

Gruß,
Simon2.
-
@Simon2
http://www.cppreference.com/cppstring/erase.html
Die 2. Version, da ab dem ersten Auftreten eines Spaces ab i alles gelöscht wir !Aber ich will doch nur die Spaces löschen die zu viel sind *heul*
Sry aber ich steh total aufm Schlauch
!mfg
SH
-
ShadowEater schrieb:
@Simon2
http://www.cppreference.com/cppstring/erase.html
Die 2. Version, da ab dem ersten Auftreten eines Spaces ab i alles gelöscht wir !Nicht ganz - da i ein int-Wert ist, wird die dritte Version aufgerufen (und 'npos' steht in diesem Fall für "von hier bis zum Stringende").
PS: Wie ich vorhin schon sagte - wirf mal einen Blick auf unique()
-
ShadowEater schrieb:
...
Die 2. Version, da ab dem ersten Auftreten eines Spaces ab i alles gelöscht wir !...Ich hatte nicht gefragt, welche Du aufrufen möchtest, sondern welche aufgerufen wird ! ... und das ist offensichtlich nicht die zweite (wie schon ein Durchzählen der übergebenen Parameter ergeben dürfte)

Gruß,
Simon2.
P.S.: Wie ich bereits sagte: Wirf mal einen Blick auf remove().
-
Gut ich benutze Deine Lösung mit remove, funktioniert jetzt auch, nachdem ich alles in ein neues Projekt kopiert habe

Aber es werden alle Spaces entfernt
nicht die die zuviel sind, es soll zwischen jedem Wort ein Space bleiben 
Danke für Deine Hilfe
Morgen brauch ich Urlaub

SH
-
Ja, da ist remove() radikal - für solche Anwendungen ist die unique()-Lösung besser geeignet (unique() löscht immer, wenn zwei aufeinanderfolgende Elemente "gleich"* sind, eins davon aus der Sequenz - das heißt, von einer beliebig langen Folge Leerzeichen überlebt am Ende genau eins).
* was "gleich" ist, bestimmt die übergebene Vergleichsfunktion - die obengenannte 'both_space()' liefert nur dann true, wenn beide Zeichen Leerzeichen sind
-
@CStoll
Du hast recht unique ist das Beste, wenn ich das gante ohne Deine F boo Both_Space regeln möchte, kann ich das Zeichen das gleich sein soll direkt übergeben ?#include<iostream> #include<fstream> #include<string> #include <algorithm> using namespace std; int main() { ifstream f; string s; s ="test string Trallala Hoppsasa"; for (int i = 0 ; i < s.length(); i++) { if (s[i] ==' ' && s[i-1] == ' ') { s.erase(unique(s.begin(),s.end(),' '),s.end()); } } cout << s << endl; return 1; }Jetzt meckert er aber :
Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'char *__cdecl std::adjacent_find(char *,char *,char)'
Was mach ich nur falsch ???
mfg
SE
-
Nein, kannst du leider nicht - unique() erwartet als dritten Parameter eine Funktion, die ihm sagt, ob zwei gegebene Werte "gleich" sind. (btw, wenn du den dritten Parameter weglässt, nutzt es op== als Vergleichsfunktion - das würde auch das zweite l aus 'Trallala' entfernen)
PS: Übrigens ist die echte Fehlermeldung wohl etwas weiter oben

-
DANKE, DANKE, DANKE

Ich schalt jetzt meinen Rechner ab, freu mich dasses klappt und heul dass ich nicht selbst drauf gekommen bin
!Oh Mann D*A*N*K*E

SE