Sortierproblem
-
Hallo,
ich sitze jetzt schon eine ganze Weile vor meinem folgenden Sortierproblem. Der in C geschriebene Algorithmus soll einfach nur irgendwie (Laufzeit egal) ein zweidimensionales char-array (oder string array wenn man so will) alphabetisch sortieren.
Nach dem Sortieren tauchen einige Wörter mehrfach auf und andere Wörter verschwinden / werden überschrieben. Hat jemand eine Idee, warum?
char buffer[elements][maxLength]; int i=0; dir_ptr = opendir( dirname ); while ( ( direntp = readdir( dir_ptr ) ) != NULL) { strcpy(buffer[i],direntp->d_name); i++; } closedir(dir_ptr); /** Jetzt folgt die Sortierschleife: **/ char temp[maxLength]; while (elements--) { for (i = 0; i < elements-1; i++) { if (strcmp(buffer[i],buffer[i+1]) > 0) { strcpy(temp,buffer[i+1]); strcpy(buffer[i+1],buffer[i]); strcpy(buffer[i],temp); } } }
Danke!
Gruß, Siegfried
-
Dieses Problem ist jetzt beseitigt. Habe einfach Zeiger verwendet, anstelle von strcpy().
for (i=0; i<elements; i++) { for (j=0; j<maxLength; j++) { if (buffer[i][j] > 96) buffer[i][j] -= 32; } } char temp[maxLength]; while (elements--) { for (i = 0; i < elements-1; i++) { if (strcmp(buffer[i],buffer[i+1]) > 0) { *temp = *buffer[i+1]; *buffer[i+1] = *buffer[i]; *buffer[i] = *temp; } } }
Allerdings habe ich beim Sortieren noch das Problem, dass bei den ASCII-Codes zuerst alle Großbuchstaben kommen und danach alle Kleinbuchstaben. Deshalb habe ich das Programm folgendermaßen erweitert: Wenn es sich um einen Kleinbuchstaben handelt (z.B. ASCII-Wert größer als 96), wird die Zahl 32 von deren ASCII-Wert abgezogen. Damit sollen alle Kleinbuchstaben zu Großbuchstaben gemacht werden.
Die Ausgabe funktioniert für die meisten Zeichen, aber leider nicht für alle. Manche Zeichen werden einfach komplett falsch dargestellt und mir ist es nur räteslhaft wieso dem so ist.
Noch eine Frage in diesem Zusammenhang: Wo liegt denn der Unterschied zwischen strcmp() und strcoll()? Soweit ich die man-page verstehe, machen beide Funktionen genau das gleiche:
In the "POSIX" or "C" locales strcoll() is equivalent to strcmp(3).
Oder kann ich in diesem Zusammenhang mit strcoll() (anstalle von strcmp()) irgendwelche Vorteile haben?
-
Siegfried1 schrieb:
Wenn es sich um einen Kleinbuchstaben handelt (z.B. ASCII-Wert größer als 96), wird die Zahl 32 von deren ASCII-Wert abgezogen. Damit sollen alle Kleinbuchstaben zu Großbuchstaben gemacht werden.
Benutze stattdessen die Funktion toupper - dann bist Du unabhängig von einer möglicherweise unerwarteten Implementierung des Zeichensatzes.
-
Belli schrieb:
Benutze stattdessen die Funktion toupper - dann bist Du unabhängig von einer möglicherweise unerwarteten Implementierung des Zeichensatzes.
Danke! Die Funktion toupper() macht alle Kleinbuchstaben zu Großbuchstaben, was sehr nützlich ist. Gibt es auch eine Funktion, die alle anderen Zeichen "in die richtige Reihenfolge" bringt?
Ok, die Reihenfolge der Zeichen sind schon durch die ASCII-Codes festgelegt... Aber wieso ordnet mein (mittlerweile ganz gut funktionierendes) ls -l Progrämmchen dann in folgender Reihenfolge?
test.c~
test2.c
test.cDie Reihenfolge des "offiziellen" ls -l ordnet nämlich in folgender Reihenfolge:
test2.c
test.c
test.c~Meine Vergleichsoperation beim Sortieren (Bubble-Sort) sieht einfach folgendermaßen aus:
if (strcmp(buffer[i],buffer[i+1]) > 0) //dann vertausche