Strings sortieren wie im Lexikon
-
Hmm, meine erste Idee wäre es, die chars mit tolower/toupper umzuwandeln, die ö's durch oe zu ersetzen und dann zu sortieren (mittels strncmp)
Ist vermutlich keine allzu effektive Methode, aber ein Anfang...
-
Genau so habe ich es bisher gehackt. Tut auch ganz ok, aber...
Die Umlaute kann ich noch nicht abfangen, laut ASCII tabelle ist zB ein 'Ö' ein (int) 153, aber wenn ich den Integerwert an der betreffenden Stelle ausgebe, krige ich eine 246 .(?)
Den cast mache ich mit "(unsigned char)string[0]"
wie kann man das erklären?
arni
-
kennt jemand den Funktionsprototyp der Funktion alphasort, sie wird zB mit scandir(..) verwendet, oder weiß, in welcher Headerdatei sie implementiert ist?
Dank arni
-
vielleicht eine verrückte Idee
Kodiere doch die Zeichen in einem String um
Nimm einen Vektor der Länge 256.
Trage die von die gewünschte Suchreihenfolge ein
char CODE[]={0x0,...,'A',Ä,B,...,O,Ö,...,Z...,...,a,ä,b...,...'};Ersetze in einer Kopie deines String und einer Kopie deines Vergleichsstring die Buchstaben durch seine Position in CODE.
Vergleiche die Strings in der Codierten Version ganz normal mit str..cmp. jetzt weist du welcher größer oder kleiner ist und du kannst die Orginale entsprechend berarbeiten.Ich hoff das klappt und viel Spaß
-
Sorry wegen der alphsortfrage, habe jetzt doch mal in den Manpages estöbert und die Frage ist rest loc beantwortet worden.
@PAD
Coole Idee! mache es so ähnlich, nur dass ich die Buchstaben in einen String schreibe, wobei ich die Wertigkeit der Asciizeichen entsprechend verändere.
Die beiden veränderten Strings werden dann verglichen, und der Rückgabewert auf den Originalstring bezogen. Leider haabe ich da noch so ein 'Umlaut-Problem'(siehe oben).
Ciao arni
-
wie is denn die Alphasort lösung aus den manpages?
Hat das vielleicht was mit dem ASCII und ANSI-ASCII Zeichensatz zu tun. Es gibt leider mindestens zwei verschiedene Zuordnungen für die zeichen > 0x80, die eine mir in DOS benutzt, die andere wird in Windows benutzt.
Ich merk das immer wenn ich C-Programme die unter DOS geschreiben und in Deutsch kommentiert habe mit unter Windows anschaue dann sind die Sonderzeichen verbogen der Total Commander nennt die DosVariante
ASCII und die Windowsvariante ANSI.Viel Glück
:p P.S: Das Setlocal von Fubar scheint interessant zu sein
-
Hab auch noch einen Vorschlag:
strcoll
Syntax:
#include <string.h>
int strcoll( const char *str1, const char *str2 );The strcoll() function compares str1 and str2, much like strcmp. However, strcoll() performs the comparison using the locale specified by the setlocale() function.
Und als Beispiel:
#include <stdio.h> #include <string.h> #include <locale.h> int main () { char text1[] = "häufig"; char text2[] = "höflich"; int x; if ((setlocale (LC_ALL,"de_DE.437")) == NULL) { fprintf (stderr,"\nKann Schauplatz nicht finden."); exit (5); } printf ("\nTextvergleich meldet: %d", x = strcoll(text1,text2)); if (x < 0) printf ("\nText1 (%s) ist kleiner Text2 (%s)", text1,text2); if (x > 0) printf ("\nText1 (%s) ist größer Text2 (%s)", text1,text2); if (x == 0) printf ("\nText1 (%s) ist gleich Text2 (%s)", text1,text2); return 0; }
Nachtrag:
verschiedene mögliche locale Namen für Deutsch: de_DE@euro,de_DE, de, ge
-
int alphasort(const struct dirent* str1, const struct dirent* str2);
Rückgabe wie bei strcmp. Welchen Sortieralgorythmus sie verwendet weißich nicht. Kann man mit scandir(char* Suchpfad, struct dirent ***namelist, funktionSelect, funktionSortierung(oft alphasort)) aufrufen.
sortiert dann die Files die aus einem Directory in 'Suchpfad' in 'struct ***namelist' eingelesen wurden. Sortiert aber leider wie 'strcmp' und nicht so, wie man es in einem Lexikon vorfindet.
-
jaaa, das sieht echt interssant aus.
((setlocale (LC_ALL,"de_DE.437")) == NULL)Habe mal schnell in die manpages geschaut:
char* setlocale(int category, const char *locale);
Category:
LC_ALL Set the entire locale generically.
LC_COLLATE Set a locale for string collation routines. This controls
alphabetic ordering in strcoll() and strxfrm().
....'de_DE.437" scheint dann wohl so eine Locale-Datei für unseren Sprachbereich zu sein (?). kenne mich damit nich so recht aus. Benutze Debian und Suse, kann man davon ausgehen, das diese Locale eigentlich immer vorhanden sind?
und strcoll() scheint ja doch die Sache so zu machen, wie im Lexikon zu sehen ist.(Ich nehme mal an, dass ist mit 'lexikographisch' gemeint?)
Also dass werde ich morgen mal reinhacken. Das ist doch einen Versuch wert.
Danke für eure Hilfe, das hat jetzt echt nen neuen Lösungsansatz gebracht.
Ciao arni
-
hey, das funzt richtig gut.Locale.h includen, mit
setlocale(LC_ALL, "de_DE@euro");
die richtige locale setzen, string.h includen und dann sortiert
int strcoll(char* string1, char* string2);
alles nach Wunsch. Fehlerfrei und schnell. Das ist einfach gut.
Wie fubar schon bemerkte, gibt es natürlich noch alle möglichen anderen locale,die je nach Bedarf gesetzt werden können.Danke fuer den Tip, fubar.
arni