Wörter aus Textdatei zählen und Anzahl mit jeweiliger Wortlänge angeben

Alles klar.
Hab es jetzt folgenderweise probiert:

" if(ws!=0 && isspace(c) ==0) wortanzahl++ ;


isspace(c);
ws=c; "


Isspace legt ja einen Wert ungleich 0 ab, wenns ein ws ist. Den Wert habe ich dan von c in "ws" übernommen.
Sobald die Schleife neu durchläuft, schaut sie, ob der Wert ungleich 0 ist und weiss somit, ob das letzte Zeichen schon ein ws war.
Gleichzeitig wird geprüft, ob das aktuelle c nun KEIN ws ist. wenn ja, dann wortanzahl++.
Andernfalls macht er mit dem c weiter und übergibt es wieder an "ws"
Aber irgendwie kommt wieder nicht das richtige raus

Mfg
 
Alles klar.
Hab es jetzt folgenderweise probiert:

" if(ws!=0 && isspace(c) ==0) wortanzahl++ ;


isspace(c);
ws=c; "


Isspace legt ja einen Wert ungleich 0 ab, wenns ein ws ist. Den Wert habe ich dan von c in "ws" übernommen.
Sobald die Schleife neu durchläuft, schaut sie, ob der Wert ungleich 0 ist und weiss somit, ob das letzte Zeichen schon ein ws war.
Gleichzeitig wird geprüft, ob das aktuelle c nun KEIN ws ist. wenn ja, dann wortanzahl++.
Andernfalls macht er mit dem c weiter und übergibt es wieder an "ws"
Aber irgendwie kommt wieder nicht das richtige raus
Warum prüfst du denn ob das letzte Zeichen != 0 ist? (wofür steht denn eigentlich "ws" - benenne deine Variablen sinnvoll. z.B. "last_char").

Hatten wir uns nicht verständigt das du prüfen mußt ob das letzte Zeichen ein Leerzeichen war und das aktuelle keins?! \edit: mir fällt gerade ein, du müßtest nicht unbedingt das letzte Zeichen speichern, sondern nur speichern ob es sich dabei um ein Leerzeichen gehandelt hat oder nicht.

Und bitte verwende die Code-Tags für deine Code-Schnipsel! Also [c]... hier dein Code ... [/c] für C Code usw.

Gruß
 
Warum prüfst du denn ob das letzte Zeichen != 0 ist? (wofür steht denn eigentlich "ws" - benenne deine Variablen sinnvoll. z.B. "last_char").

Hatten wir uns nicht verständigt das du prüfen mußt ob das letzte Zeichen ein Leerzeichen war und das aktuelle keins?! \c
Und bitte verwende die Code-Tags für deine Code-Schnipsel! Also [code=c]... hier dein Code ... [/code] für C Code usw.

Gruß

Naja, also mit "ws" wollte ich den letzten eventuellen Whitespace als Variable benennen.

Also nochmal mit sinnvoller Variablen Benennung:

C:
if(lastchar!=0 && isspace(c) ==0) wortanzahl++ ; //*wenn das letzte Zeichen (lastchar) ein Whitespace ist und das aktuelle Zeichen kein Whitespace ist -> Wortzaehler +1


isspace(c); //*testet, ob das aktuelle ein Whitespace ist und
lastchar=c;  //*"Speichert" das Ergebnis in "lastchar"

edit: mir fällt gerade ein, du müßtest nicht unbedingt das letzte Zeichen speichern, sondern nur speichern ob es sich dabei um ein Leerzeichen gehandelt hat oder nicht.

Ich dachte, genau das mache ich dadurch, dass ich den Wert speicher (0 -> kein WS, alle anderen Zahlen -> ws)?
Danke
Mfg
 
Zuletzt bearbeitet von einem Moderator:
Ich dachte, genau das mache ich dadurch, dass ich den Wert speicher (0 -> kein WS, alle anderen Zahlen -> ws)?
Nein, c enthält das aktuelle Zeichen, du speicherst den Wert von c in lastchar. Wie sollte der Wert von lastchar plötzlich 0 sein wenn c ein Leerzeichen war?

C:
int was_a_space = 1;
while (...) {
  int is_a_space = isspace(c);

  if (was_a_space && !is_a_space) {
    // Wortanfang
  }
  was_a_space = is_a_space;
}
Gruß
 
Nein, c enthält das aktuelle Zeichen, du speicherst den Wert von c in lastchar. Wie sollte der Wert von lastchar plötzlich 0 sein wenn c ein Leerzeichen war?
Hm, ich hatte gelesen, dass "isspace" eine 0 zurückgibt, wenn ein Whitespace vorhanden ist.

C:
int was_a_space = 1;   
while (...) {
  int is_a_space = isspace(c);  // isspace gibt "is_a_space" wert... welchen?

  if (was_a_space && !is_a_space) { //wenn (was a space und nicht is_a_space) dann folgt der wortanfang.. und ich starte meinen wortzaehler?
    // Wortanfang
  }
  was_a_space = is_a_space; //
}
Gruß


sorry, das verstehe ich nicht ganz, siehe oben
 
Hm, ich hatte gelesen, dass "isspace" eine 0 zurückgibt, wenn ein Whitespace vorhanden ist.
Das hast du falsch gelesen. isspace gibt einen Wert verschieden von 0 zurück (== true) wenn der übergebene Wert ein Leerzeichen war, anderenfalls (wenn es kein Leerzeichen war) gibt isspace 0 zurück.

Aber selbst dann funktioniert es nicht so wie du es gemacht hast, denn du hast den Wert von c in lastchar gespeichert und nicht den Rückgabewert von isspace.
C:
int is_a_space = isspace(c);  // isspace gibt "is_a_space" wert... welchen?
sorry, das verstehe ich nicht ganz, siehe oben
Die Variable is_a_space erhält genau den Wert den isspace zurückgibt. (Also 0 falls es kein Leerzeichen war, != 0 falls es ein Leerzeichen war).

Wenn man den Wert von is_a_space als Boolean interpretiert, ist also is_a_space WAHR genau dann wenn c ein Leerzeichen ist, FALSE anderenfalls.

Gruß
 
ook, also ich glaub, ich habs verstanden.
passt das so?:

C:
  int is_a_space = isspace(c); //* is_a_space nimmt Wert von isspace an (False=0 oder True=0)
 
  if (was_a_space && !is_a_space) { //*wenn was_a_space=true UND c ist kein Leerzeichen etc
    wortanzahl++;         //* dann ++
  }
  was_a_space = is_a_space;  //*übergibt dem nächsten Durchgang den aktuellen Wert

Und int was_a_space wird auf 1 gesetzt vor der while Schleife.
Leider liefert es mir so immernoch den falschen Wert.
Zwar "nur" um 36 Wörter... abber das muss doch gehen :/
 
Es geht um folgen Übung:
Textdatei auslesen

- Wortlänge -> zB 1 Zeichen, 5 Zeichen, 8 Zeichen.... bis 10 Zeichen


Genau so eine Übung hab ich auch... Textdatei wandel ich in ein array um, Wortanzahl hab ich eingermaßen, jetzt muss ich mir anzeigen lassen, wieviele Wörter es mit wievielen zeichen gibt? bsp. 10 wörter der länge 2, 15 der länge 3 usw... habs versucht mir alle wörter in ein mehrdimensionales array (char arr[nr_wort][wort_name zu machen, leider stürzt mein compiler (devc++) dabei immer ab :( in nr_wort lass ich nen zaehler zaehlen, und wort_name setzt sich zusammen aus den einzelnen buchstaben und unterbricht bei leer, tab oder enter... Habe gehofft eine Liste zu erhalten arr[1][hello]... arr[2][world] und damit was anfangen zu koennen.. naja, steck gerade ziemlich fest, hilfe wäre super ;)
 
Genau so eine Übung hab ich auch... Textdatei wandel ich in ein array um
Wozu? Bzw. was meinst du damit? Zeig deinen Code.
jetzt muss ich mir anzeigen lassen, wieviele Wörter es mit wievielen zeichen gibt? bsp. 10 wörter der länge 2, 15 der länge 3 usw... habs versucht mir alle wörter in ein mehrdimensionales array (char arr[nr_wort][wort_name zu machen
Wozu? Du mußt doch die Wörter nicht speichern, du mußt doch nur die Länge der Wörter zählen.
leider stürzt mein compiler (devc++) dabei immer ab :( in nr_wort lass ich nen zaehler zaehlen, und wort_name setzt sich zusammen aus den einzelnen buchstaben und unterbricht bei leer, tab oder enter... Habe gehofft eine Liste zu erhalten arr[1][hello]... arr[2][world] und damit was anfangen zu koennen.. naja, steck gerade ziemlich fest, hilfe wäre super ;)
Was meinst du damit? Zeig deinen Code.

Gruß
 
Zurück