Chars mittels qsort sortieren



  • Ich möchte ein char Array mittels der STL Funktion qsort sortieren. Meine Vergleichsfunktion CmpFunc gibt anscheinend die falschen Werte zurück. Seht Ihr einen Fehler. Hier der Code:

    #include <stdlib.h>
    #include <iostream>
    
    using namespace std;
    
    int CmpFunc (const void* _str1, const void* _str2)
    {
    
        const char* str1 = (const char*) _str1;
        const char* str2 = (const char*) _str2;
        if ( str1 < str2 )
            return -1;
        if ( str1 == str2 )
            return 0;
        else return 1;
    
    }
    
    void QSortExample()
    {
         int c;
         char *sArray[] = {"eins", "zwei", "drei", "vier", "fuenf", "sechs", 
                           "sieben", "acht", "neun", "zehn"};                       
         qsort((void*)sArray, 10, sizeof(sArray[0]), CmpFunc);
         cout << "The first ten elements of the sorted field are ..." << endl;
         for(c=0;c<10;c++)
              cout << "element #" << c+1 << " contains " << sArray[c] << endl;
         cout << endl;
    }
    
    int main()
    {
        QSortExample();
        system("pause");
        return 0;
    }
    


  • auf Pointern (egal ob void* oder const char*) bedeutet Vergleich immer ein Adressvergleich - d.h. deine Strings werden nach Anordnung im Speicher sortiert. Zum Vergleich der String-Inhalte solltest du man: strcmp() verwenden:

    int CmpFunc (const void* _str1, const void* _str2)
    {
    
        const char* str1 = (const char*) _str1;
        const char* str2 = (const char*) _str2;
        return strcmp(str1,str2);
    }
    

    PS: Noch besser ist, du verwendest std::string (statt char*) und std::sort (statt qsort).



  • CStoll (off) schrieb:

    auf Pointern (egal ob void* oder const char*) bedeutet Vergleich immer ein Adressvergleich - d.h. deine Strings werden nach Anordnung im Speicher sortiert. Zum Vergleich der String-Inhalte solltest du man: strcmp() verwenden:

    int CmpFunc (const void* _str1, const void* _str2)
    {
    
        const char* str1 = (const char*) _str1;
        const char* str2 = (const char*) _str2;
        return strcmp(str1,str2);
    }
    

    PS: Noch besser ist, du verwendest std::string (statt char*) und std::sort (statt qsort).

    Die CmpFunc Methode funktioniert bei mir nicht. Kein Char Element wird sortiert.

    Ich soll in dieser Übung zwingend qsort und *char statt string benutzen.



  • Verwende std::sort, ist schneller, sicherer und sauberer.



  • Any schrieb:

    Verwende std::sort, ist schneller, sicherer und sauberer.

    Ich habe hier keine Wahl. Ich soll qsort benutzen.



  • int CmpFunc (const void* _str1, const void* _str2)
    {
    
        const char* str1 = *(const char**) _str1;
        const char* str2 = *(const char**) _str2;
        return strcmp(str1,str2);
    }
    


  • super, es funktioniert.

    aber warum muß ich das denn mit zeiger auf zeiger machen?



  • Weil der Vergleichsfunktion Zeiger auf die zu sortierenden Elemente, die in dem Fall Zeiger auf char sind, uebergeben werden. Das steht so uebrigens auch in der Dokumentation von qsort ...


Anmelden zum Antworten