string-element über eine Funktion "trimmen"
-
@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/
-
@wob sagte in string-element über eine Funktion "trimmen":
Denn was für ein Typ kommt denn von length() zurück?
std::string::size_type
-
@wob verstehe schon was bedeutet... aber leider dürfen wir das trotzdem nicht verwenden ist echt nervig.. wenn ich im netz nach lösungswegen suche, kann ich die hälfte davon meist gar nicht verwenden
-
@wob ich hab mir das mal etwas umstrukturiert. In dieser form ist es für mich sehr viel nachvollziehbarer vielen dank nochmal!
string trimme(string s)
int start = 0; do { start++; } while(s[start] == '+'); int ende = s.length(); do { ende--; } while (ende && s[ende - 1] == '+'); string ergebnis; for (int i = start; i < ende; i++) { ergebnis += s[i]; } return ergebnis;
};
-
@mmm_1482_ sagte in string-element über eine Funktion "trimmen":
aber leider dürfen wir das trotzdem nicht verwenden
Das bezweifel ich. Es geht darum, dass ihr nicht so programmiert, wie man es eigentlich machen würde, sondern dass ihr euch selber irgendwas ausdenkt. Ob in deinem Algorithmus nun als Länge int, unsigned, size_t oder was auch immer verwendet wird, ist echt komplett egal.
Du darfst ja length() verwenden, aber den Rückgabewert nicht nutzen? Das ist doch offenbar quatsch.