Frage von Bambi1x1996, 33

Wortzähler C++ zählt immer ein Wort zu wenig. Wieso?

Hier einmal mein Code. Der liest alles aus bis auf ein Wort. Es ist immer ein Wort zu wenig. Komme nicht drauf wieso. Kann mir jemand helfen?

include

include

include "auslesen.h"

int main() {

/* Variabeln werden angelegt */

char gesamt[1000];
int zeichen=0;
int worte=0;
int anzahl[26];
int absaetze=0;
int leerzeichen=0;

/* Datei wird ausgelesen */ FILE *datei; datei = fopen("Aufgabe.txt", "r");

/* Text wird ausgewertet */ while(!feof(datei)) { gesamt[zeichen] = fgetc(datei); if(gesamt[zeichen] == ' ' || gesamt[zeichen] == '\n') worte++; if(gesamt[zeichen] == ' ' ) leerzeichen++; if(gesamt[zeichen] == '\n' ) absaetze++;

    gesamt[++zeichen] = '/0';
}


/* Anlegen der Tabelle */ for(int i=0; i<26; i++) { anzahl[i] = 0;

    for(int l=0; l<zeichen; l++)
    {
        if(gesamt[l] == 'a' + i || gesamt[l] == 'A' + i)
            anzahl[i]++;
    }
}

/* Ergebnissausgabe */ printf("Eingelesener Text:\n------------\n%s\n------------\n", gesamt); printf("\n\nZeichen: %d", zeichen); printf("\nWorte: %d", worte); printf("\nLeerzeichen: %d", leerzeichen); printf("\nAbsaetze: %d\n\n", absaetze); for(int i=0; i<26; i++) printf("%c: %d\t", 'a' + i, anzahl[i]);

return 0;

}

Vielen Dank im Vorraus

Antwort
von PWolff, 15

Endet die Datei mit einem abschließenden Zeilenumbruch oder direkt nach dem letzten Zeichen des letzten Wortes?

Eine Vorbereitung für ein optionales Ignorieren "leerer Wörter" / mehrerer Whitespaces hintereinander ist natürlich aufwendig, hat aber zum Nebeneffekt, dass die richtige Wortanzahl richtig berechnet wird (vorausgesetzt, man berücksichtigt den Beginn und das Ende der Datei richtig).

Vermutlich ist es nicht die effektivste Lösung, aber ich verwende in solchen Fällen gern eine boolesche Variable, die angibt, ob wir uns gerade in einem Wort befinden oder nicht. Die kann man dann am Ende der Datei noch mal auswerten.

Hast du dir schon Gedanken gemacht, was passiert, wenn der Speicherbereich des Arrays "gesamt" mit Zufallsbytes gefüllt ist und die Datei 0 Bytes groß ist?

Und bitte, bitte, bitte tu uns so was nicht an, in C ein String ohne Indexprüfung einlesen, so eine eklatante Einladung zum Buffer Overrun tut ja geradezu weh!

(Gewöhn dir von Anfang an an, auf so was zu achten, bis du beim Einrichten einer Einlese-Schleife eine solche Prüfung einbaust, ohne darüber nachzudenken. Das erspart viel überflüssigen Ärger mit einer der bescheuertsten Sicherheitslücke.)

Antwort
von Orsovai, 16

Das sieht mir nach C und nicht nach C++ aus um ehrlich zu sein. Beispielsweise den char Array Abschluss mit \0 oder auch printf

Antwort
von TheQ86, 18

Absolut unleserlich. Bring doch mal bitte den Quellcode ins ein lesbares Format. GF bietet auch eine Code Funktion neben den Zitaten

Keine passende Antwort gefunden?

Fragen Sie die Community