Problem bei Programm mit Zeigern
-
Hallo,
ich soll ein Programm schreiben, dass einen QuellString in einen ErgebnisString schreibt. Dabei soll aber der QuellString beim kopieren überprüft werden, ob das Wort blau drin vorkommt, z.B. "blaubeeren bleiben blau und sind nicht gruen sondern blau"
Das heisst, wenn ich den ErgebnisString ausgebe soll in diesem String überall das Wort blau durch "#" ersetzt werden. Das hab ich soweit auch hinbekommen, vorher mit Arrays. Nur leider bekomm ich das jetzt mit Zeigern nicht hin. Ich glaube er erhöht in meiner Zusatzfunktion Pruefe() bei wort nicht die Adresse um das nächste Zeichen mit dem von teststr2 zu vergleichen. Kann mir da jemand helfen?Ok, hat sich erledigt...
-
- Um die Länge eines Strings zu ermitteln, gibt es man: strlen(3)
- Um zwei Strings miteinander zu vergleichen gibt man: strcmp(3)damit kannst du deinen Code mit wenigen Zeilen schreiben.
Deine
for(j=0; *wort != '\0'; j++, wort++); //Länge von Wort ermitteln wort = wort - j;
lässt sich nicht nur durch
j = strlen(wort);
ersetzen, sondern sie auch noch falsch.Angenommen wort zeigt auf "Hallo".
1. Durchlauf: *wort != 0 j == 0; wort := wort - 0 = wort; (wort zeigt auf "Hallo") j++; wort++; (wort zeigt auf "allo") 2. Durchlauf: *wort != 0 j == 1; wort := wort - 1; (wort zeigt auf "Hallo") j++; wort++; (wort zeigt auf "allo") 3. Durchlauf: *wort != 0 j == 2; wort := wort - 2; (wort zeigt auf "??Hallo") "?" steht für ein nicht definiertes Zeichen, weil man den Speicher nicht kennt. j++; wort++; (wort zeigt auf "?Hallo") 4. Durchlauf: *wort != 0??? Undefiniert, kann alles mögliche passieren, sehr wahrscheinlich abstürzen (mit segfault) ...
pruefe
übergibst duwort
, blöd dasswort
auf undefinierten Speicher zeigt.Deine
pruefe
Funktion kannst du so schreibenint pruefe(char *teststr2, char *wort, int j, int start_pruefe) { return strcmp(wort + j, teststr2 + start_pruefe) ? 1 : 0; }
und das heißt, du kannst in
mask3
gleich so schreibenwhile(k<=i) { stimmt = pruefe(teststr2,wort,j,k); if(strcmp(wort + i, teststr2 + j)) ...
Das sage ich heute zum 2. Mal: bevor man los legt und einfach Code tippt, überleg mal, ob das, was ihr da schreibt, überhaupt Sinn macht. Damit lassen sich viele Fehler von Anfang an vermeiden.
-
Tschuldigung, auf Zeile 19 habe ich das Semikolon übersehen, somit ist meine Simulation mit wort = "Hallo" falsch.
wort = wort - j;
ist dennoch falsch, dennwrt
würde auf unbekannten Speicher zeigen.
-
Mist, ich hab vergessen zu schreiben, dass ich die Vorgabe habe, keine Funktionen aus der string.h zu verwenden. Das heisst alles selbst schreiben
-
Headhunter_X schrieb:
Mist, ich hab vergessen zu schreiben, dass ich die Vorgabe habe, keine Funktionen aus der string.h zu verwenden. Das heisst alles selbst schreiben
wer stellt solche unsinnige Aufgaben? Naja, eine
my_strlen
undmy_strcmp
zu schreiben, ist nicht wirklich schwer. Ich würde an deiner Stelle die Funktionen besser benennen.Deine
pruefe
Funktion ist dennoch Falsch. Stell dir vor du hast 2 Zeiger x, yx zeigt auf "Hallo\00123456789???????????" y zeigt auf "Hallo\001234567???????????"
Auf wenn nach dem \0-Zeichen die Funktion eine 0 zurückliefern müsste, machst du munter weiter (für j groß genug), das ist eine potentielle Sicherheitslücke.