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 ...