Syntax Frage
-
Hallo!
ich habe hier zwei Ausführungen einer Funktion, die in einem String Buchstaben ersetzt:void crypt(char *s, char alt, char neu) { while(*s) { if(*s == alt) *s = neu; s++; } }
void crypt(char *s, char alt, char neu) { while(*(s++)) { if(*s == alt) *s = neu; } }
Die zweite Funktion liefert teilweise falsche Ergebnisse.
Ist while(*(s++)) nicht erlaubt oder wird das anders interpretiert als ich mir das wünsche?Hoffe Ihr könnt mich erleuchten!
Vielen Dank!
mfg nik
-
erlaubt ist das, klar. Aber "while(*(s++))" bedeutet NICHT, daß "s" erst inkrementiert wird, wenn die Schleife durchlaufen wurde
-
Du dachtest anscheinend, das ++ wird erst nach dem kompletten Schleifendurchlauf ausgeführt. Wann das erhöhen passiert, ist nicht streng festgelegt, aber es passiert vor dem nächsten Sequenzpunkt (Anweisungsende z.b.)
Wenn man aber x nicht mehrfach zwischen 2 Sequenzpunkten modifiziert, kann man sich das Verhalten so vorstellen: x++ hat als Ergebnis den alten Wert von x, und erhöht x um 1.
-
Mhhh...und wie könnte also nun die Lösung aussehen?
Und habe ich das jetzt richtig verstanden?
while(*(s++)) inkrementiert s auf eins (wenn vorher null) und zeigt dann auf den Wert in s[1]. Oder ist es nicht klar, was in dem Befehl als erstes bearbeitet wird?thx!
mfg nik
-
ich schreib deinen zweiten Code mal um.
void crypt(char *s, char alt, char neu) { char *temp; while(temp = s, ++s, *temp) { if(*s == alt) *s = neu; } }
Nur so zur Illustration. Die richtige Lösung ist natürlich schlicht und einfach die erste Version, die du oben hingeschrieben hast
[ Dieser Beitrag wurde am 04.04.2003 um 14:07 Uhr von Bashar editiert. ]
-
Ok, vielen Dank!
Jetzt hab' ichs verstanden.mfg nik
-
allerdings würde ich die Funktion noch umbenennen zu Replace, dadurch sieht man besser die Beziehung zu Ansi-C
void crypt(char *s, char alt, char neu) { while( s=strchr( s, alt)) *s++ = neu; }
[ Dieser Beitrag wurde am 04.04.2003 um 15:56 Uhr von RenéG editiert. ]