Strcmp einmal anders ?!



  • Moin moin,
    ich habe eine sehr unnötige Aufgabenstellung erhalten, in welcher ich die Funktion strcmp anders auslagern muss. Ich bitte um mithilfe 🙂
    Ich habe Global meine struktur deklariert. (gespeichert werden Namen).
    Es geht eigentlich nur um die Funktion -compare-, in welcher ich der Variable hilf den wert der Funktion strcmp zuweisen möchte, die zurückgeliefert wird, also -1 oder 0 oder 1. Nur funktioniert das so leider nicht. Wenn ich statt return hilf,... return -1 schreibe funktioniert alles wunderbar und das programm wird ausgeführt. Mit return hilf stürzt das Programm ab.

    int compare(struct address *a, struct address *b)
    {
        int hilf;
    
        hilf = strcmp(a->name, b->name);
    
        return hilf;
    }
    

    Und so wird die Funktion aufgerufen:

    for (i=siz-1;i>0;i--)
    {
    
            if (compare(friends[i-1].name, friends[i].name) > 0)
            {
                swap(friends[i-1].name,friends[i].name);      
            }
    }
    

  • Mod

    Dave01 schrieb:

    Moin moin,
    ich habe eine sehr unnötige Aufgabenstellung erhalten, in welcher ich die Funktion strcmp anders auslagern muss. Ich bitte um mithilfe 🙂

    Bist du sicher, dass du die Funktion nicht nachprogrammieren sollst? Das wäre die sinnvolle und übliche Aufgabenstellung.

    Ich habe Global meine struktur deklariert. (gespeichert werden Namen).
    Es geht eigentlich nur um die Funktion -compare-, in welcher ich der Variable hilf den wert der Funktion strcmp zuweisen möchte, die zurückgeliefert wird, also -1 oder 0 oder 1. Nur funktioniert das so leider nicht. Wenn ich statt return hilf,... return -1 schreibe funktioniert alles wunderbar und das programm wird ausgeführt. Mit return hilf stürzt das Programm ab.

    Ausgeführt zu werden, heißt nicht, dass es richtig ist. Das Problem liegt nicht in deinem compare sondern im swap(friends[i-1].name,friends[i].name); . Da dies nur ausgeführt wird, wenn du das hilf statt -1 zurückgibst, muss hier der Fehler liegen.



  • 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