String außerhalb des Bereiches
-
Hi, ich bin gerade an einer Aufgabe dran, bei welche ein string und ein zeichen eingelesen werden. Wobei ab dem Zeichen dann der string in zwei Teile aufgeteilt werden soll und ein zeilenumbruch diese trennen.
Bsp: 123b456
wird zu :
123
456Ich weiß icht wie korrekt mein code ist, aber leider meckert der Compiler mit "Expression: string subscript out of range"
irgendwo schwabbt ein index drüberich sehe es leider nicht
seht ihr eventuell, wo der Fehler liegt?void spalte_ab_erstem(char zeichen, string eingabe, string& erster_teil, string& zweiter_teil)
{string t1 = ""; string t2 = ""; int anfang = 0; // gehe von vorne bis zum zeichen while (eingabe[anfang] < eingabe.length()) { anfang++; if (eingabe[anfang] == zeichen) { cout << endl; break; } t1 += erster_teil[anfang]; } //gehe von hinten nach vorne bis zu dem zeichen int ende = eingabe.length() - 1; while (eingabe[ende] >= 0) // { ende--; if (eingabe[ende] == zeichen) { break; } t2 += zweiter_teil[ende]; } erster_teil = t1; zweiter_teil = t2;
}
-
@mmm_1482_ sagte in String außerhalb des Bereiches:
int anfang = 0; // gehe von vorne bis zum zeichen while (eingabe[anfang] < eingabe.length()) { anfang++; if (eingabe[anfang] == zeichen)
Gehe nur mal den Teil im Kopf durch. Warum nimmst du keine for-Schleife?
-
@Jockelx
macht eine forschleife nicht imprinzip dasselbe?
ich wollte mir nur mal angwöhnen nicht immer direkt eine forschleife zu machen
-
@mmm_1482_ sagte in String außerhalb des Bereiches:
while (eingabe[anfang] < eingabe.length())
Was soll diese Zeile machen und was macht sie?
-
@mmm_1482_ sagte in String außerhalb des Bereiches:
macht eine forschleife nicht imprinzip dasselbe?
Im Prinzip ja. Dann muss man es aber auch richtig machen.
Das Inkrement (der rechte Teil der for-Anweisung) wird am Ende der Schleife gemacht.
-
@DirkB mit zeile soll von vorne bis zum letzten zeichen iteriert werden.
und mit jedem schleifendurchgang das zeichen an der stelle anfang an t1 drangehängt werden, außer wenn eingab[anfang] == zeichen ist
-
@DirkB meinst du so?
for (; eingabe[anfang] < eingabe.length(); ) { if (eingabe[anfang] == zeichen) { cout << endl; break; } t1 += erster_teil[anfang]; anfang++; } int ende = eingabe.length() - 1; for (; eingabe[ende]>= 0; ) { if (eingabe[ende] == zeichen) { cout << endl; break; } t2 += zweiter_teil[ende]; ende--; }
-
@mmm_1482_ sagte in String außerhalb des Bereiches:
@DirkB mit zeile soll von vorne bis zum letzten zeichen iteriert werden.
und mit jedem schleifendurchgang das zeichen an der stelle anfang an t1 drangehängt werden, außer wenn eingab[anfang] == zeichen istKonkreter! Nur diese Zeile:
while (eingabe[anfang] < eingabe.length())
. Oder genauer noch nur diese Bedingung:eingabe[anfang] < eingabe.length()
Was prüft diese Bedingung? Was soll sie deinem Plan nach prüfen? Was steht tatsächlich da?
-
@mmm_1482_ sagte in String außerhalb des Bereiches:
eingabe[anfang]
Was ist das? Was hat das mit der Länge zu tun?
-
@SeppJ
also übersetzt: führe den anschließenden rumpf so lange durch, bis eingabe[anfang] bis zum letzten zeichen ankommt.eingabe an der stelle anfang muss kleiner sein als die länge des strings
-
@manni66
also meine intention ist es, den gesamten string durchzugehen. einmal von vorne ( das wird dann der erste teil) und einmal von hinten ( das ist dann der zweite teil)
Für denn Fall, dass das eingegeben Zeichen gar nicht im string vorkommt, müsste der erste Teil ja dann durch den gesamten string
-
@mmm_1482_ sagte in String außerhalb des Bereiches:
also meine intention ist es
Danach habe ich nicht gefragt. Dass diese Programmstelle Mist ist sollte dir bereits klar sein. Also noch mal: was ist
eingabe[anfang]
. Welchen Datentyp hat das? Was hat das mit der Länge zu tun.
-
Sieh dir noch mal zum Vergleich die
for
-Schleife aus deinertrimme
-Funktion an: string-element über eine Funktion "trimmen"
-
@Th69 ohhhhh ... da müsse nur anfang < eingabe.length() stehen XD
dankeich versuchs mal
-
@Th69 juhu es funktionier
so ein dummer fehler .... dank danke danke
jetzt muss ich nur noch den zweiten teil nicht verkehrt herum ausgeben lassen
-
@mmm_1482_ sagte in String außerhalb des Bereiches:
anfang++;
Außerdem schau dir wann, wann du 1 zu Anfang addieren willst. Dein erster Vergleich prüfst das zweite Zeichen!
(und warum benutzt du
anfang++
statt++anfang
? Gut, hier macht es keinen Unterschied, da es ein primitiver Typ ist (der Compiler also problemlos optimieren kann) und du den Rückgabewert nicht verwendest)
-
Und deswegen schreibt man heutzutage eigentlich:
for(auto current_char: my_string) // mache irgendwas mit current_char
Okay, eigentlich schreibt man das nicht deswegen so, sondern vor allem weil's viel kürzer und einfacher ist. Aber die Anfängerfreundlichkeit und Fehlerrobustheit nimmt man auch gerne mit
-
@wob
ich verwende es aus gewohnheit immer so. Ich hab gehört, dass es meistens keinen Unterschied macht, darum denke ich gar nicht mehr daran ++variable zu schreiben
-
@SeppJ sieht auf jeden fall schöner aus
ich werde liebe grüße an unseren Prüfer schicken
-
also vielen lieben dank nochmal an alle! IHR rettet mich!