string-element über eine Funktion "trimmen"
-
Hi, ich muss einen eingegeben String über eine Funktion trimmen, falls ein "+" in dem String vorkommt.
Das Problem ist, dass durch die return anweisung der gesamte String an den aufrufer zurückgeht.
Im Debugger sieht man, dass die If-Anweisung bei str[i] -> '+' übersprungen wird. Aber es wird dennoch der alte str wieder übergeben. Ich darf keine extrafunktionen o.ä. verwenden...
Ich finde den Fehler einfach nicht, bwz es müsste etwas mit der return-anweisung sein.
Ich würde gerne return str[i] übergeben, aber da streikt der compiler.. das geht wohl nicht.
Egal hinter welche klammer ich die return anweisung setze, kommt immer das selbe Ergebnis raus:vorher: ++++eingabe++
nachher: ++++eingabe++es soll aber so sein :
vorher: ++++eingabe++
nachher: eingabestring trimme(string str) //funktion { for (int i = 0; i < str.length(); i++) { if (str[i] != '+') { return str; } } }
-
Schau dir mal die Funktionen der Klasse std::string an...
-
@Th69 ich darf keine extra funktionen verwenden
außer .at() und .length()Durchgestrichen
-
Dann ist die Aufgabe nicht lösbar, denn auch
[i]
ist eine Funktion (bzw. Operator) derstd::string
-Klasse (denn du mußt ja den übergebenen String verändern bzw. einen neuen String erzeugen - und somit dessen Klassenfunktionen benutzen).
-
@Th69
wäre es lösbar, wenn man nicht jedes zeichen überprüfen müsste? Also nur die zeichen, die vor und nach den Buchstaben stehen?zb:
vorher : ++++mon++a+++
nachher: mon++a
-
@Th69 ich meine mit extra funktionen die Punkte aus der Liste, die du verlinkt hast. Von denen darf ich nur .at() und .length() verwenden
-
OK, ich nehme jetzt mal an, daß man wenigstens einen Konstruktor (außer dem Standardkonstruktor) benutzen darf:
std::size_t pos, count; // ... return std::string(str, pos, count);
Jetzt mußt du nur
pos
undcount
herausfinden.
-
@Th69 ich versuche es gleich mal.. ich probier gerade einen anderen ansatz aus
danke
-
Ich glaube nicht, dass das so gemacht werden soll, wie @Th69 vorgeschlagen hat. Ohne eine genaue Aufgabenstellung ist das aber Rumraterei.
-
@Jockelx die genaue aufgabestellung lautet:
(Funktionen, Schleifen, string)
Schreiben Sie eine Funktion …
string trimme(string s)
… welche die "getrimmte/bereinigte Form" von s zurückgibt.
"Bereinigen" bedeute dabei, dass Pluszeichen am Anfang und/oder am
Ende von s nicht mit ins Resultat übernommen werden, alle anderen
Zeichen des Strings s hingegen schon.
Pluszeichen innerhalb des Strings sollen durch die Funktion nicht
verändert werden.Anmerkung (für diejenigen, die diese Systemfunktionen kennen):
Systemfunktionen der C++ strings wie erase(), resize() etc. sind
verboten! Nur Konstrukte, die wir auch in der Vorlesung behandelt haben:
length(), at(), + und += auf Strings, …Hauptprogramm zum Testen:
int main()
{string s = ""; cout << "Bitte geben Sie den Text ein: " << endl; getline(cin, s); cout << "Vorher: " << s << endl; cout << "Nachher: " << trimme(s) << endl; system("PAUSE"); return 0;
}
-
@mmm_1482_ sagte in string-element über eine Funktion "trimmen":
, + und += auf Strings,
Und schon sieht die Sache völlig anders aus!
-
Also auf die schlechteste Art...
-
@Jockelx ich weiß gerade nicht, wie ich das anwenden kann XD bzw das mein problem löst
-
Du mußt quasi den von mir erwähnten Konstruktor nachbauen, d.h. mittels einer Schleife die einzelnen Zeichen per
+=
(zu einer neuenstring
-Variable) hinzufügen (und vorher die passenden Indizes für die Schleife berechnen).
-
@Th69 okay danke ich versuch das mal
-
du könntest auch sowas machen:
int numplus; //anzahl der plusse am anfang zählen numplus = 0; for(int i = 0; i < str.length(); i++) { if(str[i] != '+') { break; } numplus++; } //alle zeichen hinter dem letzten vorderen plus nach "vorne" kopieren for(int i = 0; i < str.length() - numplus; i++) { str[i] = str[i + numplus]; } //alle plusse am ende der zeichenkette löschen for(int i = str.length() - 1; i >= 0; i--) { if(str[i] == '+') { str[i] = 0; } else { break; } }
-
@Wade1234 sagte in string-element über eine Funktion "trimmen":
//alle plusse am ende der zeichenkette löschen
for(int i = str.length() - 1; i >= 0; i--)Huiuiui...
Ich würde von dieser Variante abraten. Insbesondere wenn man mal einen Leerstring einsetzen will
Ich vermute, dass man es so machen soll:
string trimme(string s) { // const string &? oder hattet ihr das noch nicht? size_t end_idx = s.length(); while (end_idx && s[end_idx - 1] == '+') --end_idx; size_t start_idx = 0; while (s[start_idx] == '+') ++start_idx; string result; for (int i = start_idx; i < end_idx; ++i) result += s[i]; return result; }
-
@wob daanke ich versuch das jetzt mal zu verstehen, aber es funktioniert!
thema referenzen hatten wir und dürfen wir auch verwenden
-
@wob size_t dürfen wir leider nicht verwenden, gibt dafür eine alternative?
-
@wob hab schon gesehen unsigned int geht auch
-
@mmm_1482_ sagte in string-element über eine Funktion "trimmen":
@wob size_t dürfen wir leider nicht verwenden, gibt dafür eine alternative?
Merkwürdig. Denn was für ein Typ kommt denn von
length()
zurück? Schau mal auf http://www.cplusplus.com/reference/string/string/length/