Moin,
ich schreibe gerade ein Programm,
welches eine Txt Datei einliest und dann jeweils zählt,
wie häufig jeder Buchstabe vorkommt.
Dafür gehe ich die Zeilen des Textes immer zeichenweise durch
und vergleich sie mit einem Array in welchem ich das ALphabet
gespeichert
habe. Dann addiere ich zu den jeweiligen Buchstaben Zählern einen hinzu.
Das klappt auch solagen ich keine Leerzeilen habe. Dann nämlich addiert
er mir gerne mal ein oder zwei zusätzlich hinzu.
Ich bin da mit meinem Latein ziemlich am Ende und nach 7 Std Suchen auch
ziemlich gefrustet^^ Vielleicht ist es ja eine Fehler den einer von euch
sofort sieht, wäre toll!
Vielen Dank schon mal,
Patrick
Bist du dir sicher, dass eine Zeile immer LLINE lang ist?
Bei der Leerzeile bin ich mir da nicht so sicher...
Ändere doch mal
for(cnti = 0; cnti < LLINE; cnti++)
in
for(cnti = 0; cnti < LLINE && line[cnti] != 0; cnti++)
fgets hat auch einen Returnvalue. Schau dir mal folgende Seite an:
http://www.cplusplus.com/reference/cstdio/fgets/
Obiges Programm analysiert den Lesepuffer line[] unabhängig davon, wie
lang der eingelesene Text ist. Somit werden z.B. bei Leerzeilen fast
alle Zeichen aus der zuvor eingelesenen Zeile solange weitergezählt, bis
die nächste Zeile aus der Datei keine Leerzeile mehr ist.
Das Programm sollte beim Auftreten der Null-Terminierung bzw. des
Zeilenendes im Lesepuffer die Zählschleifen verlassen und mit der
nächsten Zeile aus der Datei fortfahren.
Eine Leerzeile in einer TXT-Datei enthält nur das Zeilenende-Zeichen,
i.d.R. die 2 ASCII-Codes 13 (Carriage Return) und 10 (Line Feed).
Die innere Schleife hat nicht auf die maximale Länge des Arrays begrenzt
zu sein, sondern auf die Länge der aktuell gelesenen Zeile. Sonst werden
laufend Speicherüberreste aus vorigen Zeilen mit einbezogen. Da fgets
"bis zu" Zeichen holt, d.h. auch weniger, scheitert die Codelogik
bereits, wenn nachfolgende Zeilen kürzer als vorhergehende sind. Eine
Leerzeile ist dabei definitiv kürzer.
mal abgesehen davon: ist das ganze Prinzip mit dem Alphabet im Array
nicht eh sehr suboptimal? warum nutzt man nicht aus, das 'a' == 97, 'b'
== 98,...?
also sowas wie
for(cnti...)
alphcnt[line[cnti] - 97]++
eventuell noch mit Abfrage, ob ein Buchstabe zwischen 'a' und 'z'
vorliegt...
Warum liest du eine ganze Zeile ein, wenn du jedes Zeichen einzeln
untersuchst?
fgetc statt fgets.
Warum mit jedem Zeichen im Alphabet einzeln überprüfen?
Feststellen ob das eingelesene Zeichen >= 'a' und <= 'z' ist.
(Dafür gibt es die Funktion islower() aus der ctype.h)
Wenn das Zeichen ein Kleinbuchstabe ist, dann kannst du es als Index im
Array nutzen.
alphcnt[zeichen-'a']++;
Aber warum auf Kleinbuchstaben einschränken?