Strcmp einmal anders ?!



  • compare erwartet Adressen von structs.
    Du übergibst aber char*



  • Ich gehe mal davon aus, dass Du eher Deine "eigene" strcmp basteln sollst, sowas umfassendes wie z.B.

    int davecmp ( const char *aHoernchen, const char *bHoernchen)
    {
       int RueckGabeWert = 0;
       for ( ; *aHoernchen != 0 && *bHoernchen != 0; aHoernchen++, bHoernchen++ )
           RueckGabeWert = (*aHoernchen > *bHoernchen) ? 1 : (*aHoernchen < *bHoernchen) ? -1 : 0;
       return RueckGabeWert;
    }
    

    Dein ursprünglicher "Programmfehler" liegt aber wie von SeppJ schon treffend bemerkt in der swap-Zeile.



  • Bei der o.g. Implementierung von compare muss der Aufruf natürlich heißen:

    if (compare(&friends[i-1], &friends[i]) > 0)
            {
    

    Hast du keine Compilerwarnungen bekommen?
    Die weisen dich auf solche Fehler hin und sind dazu da, gelesen und beachtet zu werden.



  • Wutz schrieb:

    Bei der o.g. Implementierung von compare muss der Aufruf natürlich heißen:

    if (compare(&friends[i-1], &friends[i]) > 0)
            {
    

    Hast du keine Compilerwarnungen bekommen?
    Die weisen dich auf solche Fehler hin und sind dazu da, gelesen und beachtet zu werden.

    Compilerwarnungen? Neumodischer Schnickschnack!
    Immer schön mit gcc -w kompilieren ("Übersetzen & Klappe halten!") 😉



  • Warum diese unnötige und IMHO äußerst unschön klingende Variable "hilf", wenn du doch auch gleich "return strcmp(a->name, b->name);" schreiben kannst?



  • Genau das war das Problem das der addressoperator hat gefehlt!! Danke hab echt lange herumprobiert.
    Ja ihr habt recht die strcmp ist nachzuprogrammieren. Ich weiss aber nicht ob das leicht geht wie es gedacht ist. Ich geh mal davon aus, dass es sich ausschließlich um Kleinbuchstaben handelt.

    Angenommen ich übergebe einer Funktion s1 und s2. Dann kann man ja doch nicht einfach if(s1 < s2) return -1; if(s1 > s2) return 1 usw. Weil es wird ja der string als ganzes gesehen ob er größer ist und nicht die einzelnen Buchstaben?
    Vielleicht kann ich meine Gedankenweise so verdeutlichen.

    Bsp. abs = bca (1+2+3 = 2+3+1)
    Bsp. zzz < yyyyyy (26+26+26 < 25+25+25+25+25+25)
    (lt. ASCII natürlich anders)

    hoffe ihr versteht wie ich das meine



  • Strings in C sind Zeichen-Arrays (bzw. Zeiger darauf) - der einfache Vergleich per < vergleicht diese Adressen, damit kommt nicht viel sinnvolles dabei heraus. strcmp() wird verwendet, um die Strings lexikografisch zu vergleichen (d.h. in der Reihenfolge wie in einem Leikon). Wenn du etwas anderes benötigst, mußt du die Vergleichsfunktion schon selber schreiben.



  • Nein nein das mein ich schon genau das versuche ich nachzuprogrammieren.



  • Wenn du strcmp() nachprogrammieren willst, mußt du in einer Schleife die einzelnen Zeichen miteinander vergleichen - wenn sie identisch sind, gehst du zum nächsten Zeichen, andernfalls weißt du, welcher String größer ist.

    (btw, nach lexikografischer Ordnung ist abc < bca und zzz > yyyyyy ;))



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

Anmelden zum Antworten