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.


Anmelden zum Antworten