string array mit qsort sortieren
-
Hallo!
Ich bräuchte mal etwas Nachhilfe in Pointern und Arraydefinitionen
Ich habe folgenden Code:
#include <stdio.h> #include <stdlib.h> #include <string.h> int compare1( void const * lhs, void const * rhs ) { char * left = *((char **) lhs); char * right = *((char **) rhs); printf("'%s' : '%s'\n",left, right); return strcmp( left, right ); } int compare2( void const * lhs, void const * rhs ) { char * left = *((char **) lhs); char * right = *((char **) rhs); // printf("'%s' : '%s'\n",left, right); return strcmp( left, right ); } int main (void) { char test1[100][100]; strcpy(test1[0],"A"); strcpy(test1[1],"E"); strcpy(test1[2],"A"); strcpy(test1[3],"B"); strcpy(test1[4],"H"); strcpy(test1[5],"D"); strcpy(test1[6],"F"); strcpy(test1[7],"C"); strcpy(test1[8],"G"); char const * test2[] = { "A","E","A","B","H","D","F","C","G"}; int i = 0; printf( "Originalreihenfolge:\n" ); for( i = 0; i < 9; ++i ) printf( "%d: %s\n", i, test2[i] ); qsort( test2, 9, sizeof( char * ), compare2 ); printf( "\nsortierte Reihenfolge:\n" ); for( i = 0; i < 9; ++i ) printf( "%d: %s\n", i, test2[i] ); printf( "\n" ); printf( "Originalreihenfolge:\n" ); for( i = 0; i < 9; ++i ) printf( "%d: %s\n", i, test1[i] ); qsort( test1 , 9, sizeof( char * ), compare1 ); printf( "\nsortierte Reihenfolge:\n" ); for( i = 0; i < 9; ++i ) printf( "%d: %s\n", i, test1[i] ); return EXIT_SUCCESS; }
Die Sortierung von test2 klappt, die von test1 nicht.
In der entsprechenden compare funktion compare1 habe ich verm. einen Denkfehler mit den Pointern, allerdings ist das die einzige Variante, die ich probiert habe, die ohne Fehler compiliert.
Der Unterschied scheint in der Art zu liegen, wie die Arrays definiert sind.
Kann mich da bitte jemand mal "an die Hand" nehmen?
Danke!
OkkaPapa
-
Mal wieder typischer Fehler, wenn man unnötig in der Gegend rumcastet, um einen Compiler ruhig zu stellen:
const char * left = lhs; const char * right = rhs;
So muss das lauten. Bei beiden. Der Cast war total falsch. Und unnötig. In C können void* implizit in andere Zeigertypen umgewandelt werden.
Außerdem beim Aufruf:
qsort( test1 , 9, sizeof( *test1 ), compare1 );
und der Schönheit halber
qsort( test2, 9, sizeof( *test2 ), compare2 );
Also insgesamt:
#include <stdio.h> #include <stdlib.h> #include <string.h> int compare1( const void * lhs, const void * rhs ) { const char * left = lhs; const char * right = rhs; printf("'%s' : '%s'\n",left, right); return strcmp( left, right ); } int compare2( void const * lhs, void const * rhs ) { const char * left = lhs; const char * right = rhs; // printf("'%s' : '%s'\n",left, right); return strcmp( left, right ); } int main (void) { char test1[100][100]; strcpy(test1[0],"A"); strcpy(test1[1],"E"); strcpy(test1[2],"A"); strcpy(test1[3],"B"); strcpy(test1[4],"H"); strcpy(test1[5],"D"); strcpy(test1[6],"F"); strcpy(test1[7],"C"); strcpy(test1[8],"G"); char const * test2[] = { "A","E","A","B","H","D","F","C","G"}; int i = 0; printf( "Originalreihenfolge:\n" ); for( i = 0; i < 9; ++i ) printf( "%d: %s\n", i, test2[i] ); qsort( test2, 9, sizeof( *test2 ), compare2 ); printf( "\nsortierte Reihenfolge:\n" ); for( i = 0; i < 9; ++i ) printf( "%d: %s\n", i, test2[i] ); printf( "\n" ); printf( "Originalreihenfolge:\n" ); for( i = 0; i < 9; ++i ) printf( "%d: %s\n", i, test1[i] ); qsort( test1 , 9, sizeof( *test1 ), compare1 ); printf( "\nsortierte Reihenfolge:\n" ); for( i = 0; i < 9; ++i ) printf( "%d: %s\n", i, test1[i] ); return EXIT_SUCCESS; }
Wenn das nicht compiliert, weil der Compiler sagt, const void* könnte nicht in const char* umgewandelt werden, dann benutzt du einen C++-Compiler.
-
Bei test1 willst du char[100] sortieren,
bei test2 dagegen char*test1 kannst du auch direkt initialisieren:
char test1[100][100] = { "A","E","A","B","H","D","F","C","G"};
-
Hallo!
Da ich in letzter Zeit viel mit qsort und structs rumsortiert habe dachte ich schon ich hätt's kapiert
Aber heute dachte ich schon, dass ich doch zu doof dazu bin.
const char * left = lhs kapiere ich, das andere Zeugs hinterläßt ja Knoten in der Hirnwindung.
Jedenfalls vielen Dank für die schnelle und kompetente Hilfe!!
Ciao
OkkaPapa