Wörter zählen(String)



  • Hallo!

    Hier mal das Programm:

    #include<stdio.h>
    #define MAX_LEN 20
    
    int woerter(char text[], int laenge);
    int woerter(char text[], int laenge)
    {
    int wort = 0;
    int i=0;
    
    for(i=0; i<=laenge; i++)
      {
        if(text[i]==' ' && text[i-1] != ' ')
        {
         wort++;
        }
      }
      wort++;
      return (wort);
    }
    
    int main ()
    {
      int laenge=100;
      char text[100];
      int wort;
    
      printf("Geben sie belibige Woerter ein: \n");
      gets(text);
      wort=woerter(text, laenge);
    
     printf("Es sind  %d Woerter \n", wort);
    
    }
    

    Ok diese Programm zählt Worter.
    Aber ich versteh das ganze Unterprogramm nicht. Was macht es?
    Was macht die for da(Ich weiß was for macht in C)?

    Was bedeutet die if(Ich weiß was if macht in C)?

    Bitte erklärt mir das ganze Unterprogramm mal.

    Danke.

    MfG C_Boy



  • Die Funktion (du nennst dies Unterprogramm) arbeitet falsch und produziert undefiniertes Verhalten.
    Falsch deswegen, weil beim Leerstring 1 rückgegeben wird und undefiniert weil ausserhalb der Arraygrenzen zugegriffen wird.
    Willst du jetzt wirklich noch wissen, wie diese Funktion funktioniert?
    Wie würdest du denn vorgehen um die Worte in einem String zu zählen?



  • Bei i=0 gibts mit text[i-1] was auf die Finger!



  • ok... das mit der länge würd ich gleich im unterprogramm machen, sprich als
    abbruch bedingung für die for-schleife!

    so in etwa:

    for( i = 0;  string[i]!='\0'; i++)
    

    damit musst du die länge nicht mitübergeben und greifst (ausser du verpfuscht etwas danach) nicht ausserhalb der arraygrenze zu...

    weil bei deiner for-schleife siehts ja so aus:

    for( i=0; i <= laenge; i++)

    naja, ein array beginnt mit dem index bei 0, sprich die laufvariable beginnt von null weg. würdest du jetzt zum beispiel ein wort mit 10 buchstaben haben und du übergibst die laenge mit dem wert 10 so überschreitest du die array-grenze... denn das letzte element ist mit index 9. ausser natürlich du hast einen array mit der größe 100 und liest ein wort mit 10 buchstaben (oder ein satz mit n zeichen) so ist das letzte element mit dem index der anzahl der zeichen. doch dabei tun sich manche schwer und geben eine falsche max_grenze an... daher: lass die länge länge sein und verwende die obere for-schleife.

    denn dort überprüft er ob ein zeichen bzw. element deines arrays den wert '\0' hat... wenn ja, dann bricht er ab, denn dann ist das wort bzw. der satz zu ende :xmas2:

    ach ja, falls du die laenge eines jeden einzelnen worte willst, hier ein kleiner tipp: es geht entweder mit der vordefinierten funktion strlen() oder du machst es mit 2 verschachtelten for-schleifen.

    die äussere geht zeichen für zeichen durch, die innere zählt mit. falls du nich drauf kommst, kannste ja noch mals schreiben.



  • Nimm das als Ausgangslage:

    #include <stdio.h>
    #include <ctype.h>
    
    size_t woerter(char *text)
    {
    	size_t word_count = 0;
    	int is_space, was_space;
    	for (was_space = 1; *text; was_space = is_space)
    		if (!(is_space = isspace(*text++)) && was_space)
    			word_count++;
    	return word_count;
    }
    
    int main()
    {
    	char text[100];
    	puts("Geben sie beliebige Wörter ein:");
    	fgets(text, sizeof(text) / sizeof(text[0]), stdin);
    	printf("Es sind %d Wörter\n", woerter(text));
    }
    

    Idee:
    Ein Satz besteht aus Leerzeichen und Nicht-Leerzeichen.
    Ein Wort beginnt beim Wechsel von Nicht-Leerzeichen zu Leerzeichen.
    Damit diese Regel für das erste Wort gilt, fügen wir künstlich ein Leerzeichen vor dem Satzanfang ein.
    Wir müssen also die Wechsel zählen und genau das macht meine obige Funktion (sie erkennt wegen der Funktion isspace z.Bsp. Tabulatoren auch als Leerzeichen)


Anmelden zum Antworten