qsort macht Murks



  • Hi,
    Ich habe ein ziemlich sinnfreies Programm geschrieben, das Buchstaben in einem Array sortiert:

    #include <iostream>
    using namespace std;
    
    int Vergleiche (const void* str1, const void* str2)
    {
    
    	if ( (char)str1 < (char)str2 )
    		return -1;
    	if ( (char)str1 == (char)str2 )
    		return 0;
    	else return 1;
    
    }
    
    int main ()
    {
    
    	char chString[9] = "Autohaus";
    
    	cout << chString << endl;
    
    	qsort( (void*)chString, 9, sizeof( char ), Vergleiche );
    
    	cout << chString << endl;
    
    	return 0;
    
    } // main
    

    Zu meiner Überraschung gibt das Programm jedoch folgendes aus:
    Autohaus
    hutoAus
    Da wurden ja nur zwei Buchstaben vertauscht, liegt es vielleicht an meiner Vergleiche Funktion? Ich erkenne den Fehler nicht.



  • So gehts

    #include <iostream>
    using namespace std;
    
    int Vergleiche (const void* str1, const void* str2){
        if ( *((char*)str1) < *((char*)str2) )
            return -1;
        if ( *((char*)str1) == *((char*)str2) )
            return 0;
        else return 1;
    }
    
    int main ()
    {
    
        char chString[9];
        strcpy( chString, "Autohaus");
        cout << chString << endl;
    
        qsort( (void*)chString, strlen(chString), sizeof( char ), Vergleiche );
    
        cout << chString << endl;
        return 0;
    
    }
    

    Kurt



  • int Vergleiche( const void * a , const void * b )
    {
       return strcmp(reinterpret_cast<const char*>(a),reinterpret_cast<const char*>(b));
    }
    


  • RedundancyKiller schrieb:

    int Vergleiche( const void * a , const void * b )
    {
       return strcmp(reinterpret_cast<const char*>(a),reinterpret_cast<const char*>(b));
    }
    

    Sorry aber mit strcmp kannst du keine char vergleichen.
    Kurt



  • Unter C++ gibts bessere Möglichkeiten zu Sortieren.



  • Jetzt hab ich es durch ausprobieren selber rausgefunden, in der Vergleiche Funktion muss es (char) heißen.


Anmelden zum Antworten