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. ]


Anmelden zum Antworten