Wörter alphabetisch ordnen
-
Ganz schön gewöhnungsbedürftig mit 2D Arrays und Pointern zu arbeiten.
size_t woerter(char *text) { size_t word_count = 0; int is_space; int was_space; int a = 100; char *woerter; char **Stringarray; int i = 100; int zeichenzahl = 0; //zum buchstaben zählen Stringarray = (char**) malloc(100 * sizeof(*Stringarray)); //sizeof(Stringarray[0]) woerter = (char*) calloc (100, 100 * sizeof(*woerter)); // sizeof(woerter[0]) calloc, weil nach kopiervorgang wieder leer for (was_space = 1; *text; was_space = is_space) { zeichenzahl++; if (!(is_space = isspace(*text++)) && was_space) { strcpy(woerter, text-1); // kopiert das Wort in woerter strncpy(Stringarray[word_count], woerter, zeichenzahl); //von woerter ins stringarray, woerter ist danach wieder frei zeichenzahl = 0; //zeichenzahl wieder auf 0 setzen word_count++; } } printf("%s", Stringarray[1]); return word_count; }
Ich zähl also die Zeichen bis zum Leerzeichen, dann kopier ich den darin befindlichen Inhalt in woerter. Von woerter gehts weiter ins Stringarray. woerter ist danach wieder leer. Stopp.
Nun müsste ich mir gemerkt haben, wo ich war. Also evt noch einen zusätzlichen Counter einbauen. Da soll strncpy dann wieder kopieren. Dann sollte das befüllen klappen. Im Moment gehe ich nur noch etwas unsanft mit den Schreibrechten um, aber das sollte sich danach noch beheben lassen.
-
C-Tabaluga schrieb:
Von woerter gehts weiter ins Stringarray. woerter ist danach wieder leer.
Wie kommst du darauf, dass woerter wieder leer ist?
C-Tabaluga schrieb:
strncpy(Stringarray[word_count], woerter, zeichenzahl);
klappt nicht, da bei Stringarray[word_count] kein Speicher hinterlegt ist. Dieser Speicher sollte eigentlich woerter sein.
Stringarray enthält nur die Zeiger auf den Speicher, wo die Wöerter abgelegt sind.
Den Speicher musst du aber erst besorgen. Für jedes Wort neu. Da passiert nichts automatisch.Zudem zeigt text auf das Ende vom Wort. Das ist für das kopieren etwas schlecht.
Pseudo-Speicher für die Wortliste holen // das ist Stringarray solange noch Zeichen im Text sind Ist das ein Wortanfang? dann Stelle merken Ist das ein Wortaende? dann Länge vom Wort berechnen // zeichenzahl oder Wortanfang-Wortende Speicher für Wort holen (Länge +1) // calloc Wort in Speicher kopieren // strncpy(Speicher,Wortanfang,Länge) Wort terminieren // Speicher[Länge] = '\0'; Speicher in Stringarray eintragen // Stringarray[word_count] = Speicher_den_du_von_calloc_hast word_count erhöhen. nächstes Zeichen im Text nehmen Stringarray[word_count] = NULL // Endemarkierung
Was noch fehlt ist die Überprüfung, ob Stringarray voll ist (mehr als 99 Wörter)
Wenn du das mit der Endemarkierung machst, dann ist die Ausgabe auch ganz einfach:
for(i=0;Stringarray[i];i++) puts(Stringarray[i]);
Nochmal zu calloc. Du hast da Platz für 100*100 Zeichen reserviert.
Der erste Parameter gibt die Anzahl der Elemente an, der zweite die Größe der Elemnte.
Diese beiden Werte werden multipliziert.calloc (Länge, sizeof(*woerter)); // so ist es gedacht //oder calloc (sizeof(*woerter),Länge); // geht auch
Schnapp dir endlich mal den Debugger.