strcmp selbst nachcoden, so richtig?



  • Hi,

    ich wollte fragen ob meine selbst nachgecodete strcmp richtig ist (laufen tut se ja aber will wissen, ob man se besser machen kann/sollte)

    Hier der code:

    int strcmp(const unsigned char *s1, const char *s2)
    {
        int i = 0;
    
        while(true)
        {
            i++;
    
            if (*(s1+i) != *(s2+i))
            { 
                return (false); 
                break; 
            }
    
            if (*(s2+i) == 0) 
            { 
                return (true); 
                break; 
            }
        }
    }
    

    kann man da noch irgendwas verbessern? 😕



  • - Du vergleichst das erste Zeichen nicht.
    - Der Rückgabewert von strcmp hat eine andere Bedeutung.

    Warum ist der erste Parameter unsigned?



  • btw... 😉
    1.) Was soll das break hinter dem return?
    2.) Warum benutzt du i++ statt ++i?
    3.) Warum zählst du die Parameter s1 und s2 nicht sofort hoch?
    4.) Was machst du wenn s1 am Ende ist und s2 noch nicht? Abstürzen?
    5.) Guck dir nochmal genau an was das richtige strcmp zurück gibt (Tipp: Nicht true und false).



  • Mein Vorschlag 😉

    int strcmp(const char* src, const char* dst) {
            int ret = 0;
    
            while(!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst)
                    ++src, ++dst;
    
            if(ret < 0)
                    ret = -1;
            else if(ret > 0)
                    ret = 1;
    
            return(ret);
    }
    


  • Wieso nicht so? Finde ich besser...

    int strcmp(const char* src, const char* dst) {
      int ret = 0;
      while(!(ret = *src - *dst) && *src && *dst)
        ++src, ++dst;
    
      return ret;
    }
    

    [ Dieser Beitrag wurde am 11.07.2003 um 11:25 Uhr von MaSTaH editiert. ]



  • @DanielE:
    Den expliziten Cast mußt du mir erklären, denn

    char != signed char != unsigned char
    

    würde ich mal behaupten und dann kommen mit dem cast ggf. falsche oder fragwürdige ergebnisse raus. Auch das Normieren auf -1, 0 und +1 ist eigentlich für die meisten Anwendungen nicht notwendig.



  • Hääää?

    char != signed char

    Quatsch!



  • MastaH: www.nuhr.de



  • bitte erklären :p :p



  • @Mastah
    char, signed, unsigned char sind unterschiedliche Typen. Das ist standardisierter Quatsch 😉
    Der Standard macht keine Annahmen darüber, ob char vorzeichenbehaftet ist oder nicht. Kann ich aber auch nix für 😉

    [ Dieser Beitrag wurde am 11.07.2003 um 11:58 Uhr von virtual editiert. ]



  • also ich poste hier dann mal die lösung von der schule 😃 hoffe, sie stimmt soweit

    /*
    vergleicht Strings (bzw. char-Arrays), Returnwert: 
    
    0...wenn Strings gleich
    >0..wenn String 1 größer
    <0..wenn String 2 größer
    
    */
    int my_strcomp(char *str1, char *str2)
    {
        int i=0;
        while(str1[i]!='\0')
        {
            if(str1[i]==str2[i])
            {
                i++;
            }
            else
            {
                return str1[i]-str2[i];
            }
        }
        return str1[i]-str2[i];
    }
    


  • Dann will ich auch mal:

    int strcmp(char *a, char *b)
    {
        while (*a && *a == *b) 
            ++a, ++b;
    
        return *a - *b;
    }
    

    kurz & einfach... 🙂



  • Hi,

    und welche Variante ist nun die Beste Lösung? 🙂

    Gruß,
    Ikari, Der der auf ner LAN ist 😃



  • Ich denke mady seine Version ist die beste, wobei man darüber nachdenken kann, die while - Bedingung umzudrehen:

    while (*a == *b && *a)
    

    Könnte je nach String noch ein paar Zyklen bringen.



  • Original erstellt von virtual:
    @Mastah
    char, signed, unsigned char sind unterschiedliche Typen. Das ist standardisierter Quatsch 😉

    Man kann doch nicht generell sagen "char != signed char != unsigned char". Wenn man nur char schreibt ist das von der Implementation abhängig ob er signed oder unsigned ist. Ich habe dich leider nur zur Hälfte zitiert (shame on me 😉 ). Oder habe ich jetzt nen totalen Gehirnabsturz?



  • Es ist ein anderer Typ, hat aber einen Wertebereich, der entweder identisch zu 'signed char' oder 'unsigned char' ist.

    Original erstellt von virtual:
    @DanielE:

    Das war ich natürlich nicht. Das erkennt man am Smiley :).

    expliziten Cast

    Ein schöner Pleonasmus.


Anmelden zum Antworten