2017-03-04 4 views
0

Ich habe gerade angefangen, C Sprache zu lernen und wie das Thema sagt, muss ich einen Code schreiben, der eine andere Textdatei liest und die Anzahl zählt "Zeichen", "Wörter" und "Sätze" bis EOF erreicht ist. Meine aktuellen Probleme sind, dass ich nicht in der Lage bin, die richtige Ausgabe zu produzieren.C Programmierung: zählt die Anzahl der Zeichen, Wörter und Zeilen aus einer anderen Textdatei

Zum Beispiel einer Textdatei mit dem folgenden Inhalt enthält ...

the world 
is a great place. 
lovely 
and wonderful 

ausgeben soll mit 39 Zeichen, 9 Worten und 4 Sätzen und ich irgendwie 50 (Zeichen) 1 (Worte) 1 (Sätzen)

Dies ist mein Code:

#include <stdio.h> 

int main() 
{ 
int x; 
char pos; 
unsigned int long charcount, wordcount, linecount; 

charcount = 0; 
wordcount = 0; 
linecount = 0; 

while(pos=getc(stdin) != EOF) 
{ 
    if (pos != '\n' && pos != ' ') 
    { 
    charcount+=1; 
    } 

    if (pos == ' ' || pos == '\n') 
    { 
    wordcount +=1; 
    } 

    if (pos == '\n') 
    { 
    linecount +=1; 
    } 

} 

    if (charcount>0) 
    { 
    wordcount+=1; 
    linecount+=1; 
    } 

printf("%lu %lu %lu\n", charcount, wordcount, linecount); 
return 0; 
} 

Vielen Dank für jede Art von Hilfe oder einen Vorschlag

+2

Mit 'char pos zu testen; ... while (pos = getc (stdin) ', besser" int pos; "zu verwenden, um die 257 verschiedenen Werte von' fgetc() 'zu unterscheiden - obwohl ich bezweifle, dass dies dein aktuelles Problem ist, – chux

+0

Wo öffnest du die Datei? –

+0

Sie können Ihre Frage bearbeiten, um anzuzeigen, dass Sie erwarten, dass der Benutzer den Beispieltext in stdin eingibt, oder stdin aus dem Code entfernt – jrh

Antwort

2

Aufgrund der Vorrangstellung des Bedieners sind die beiden folgenden Zeilen identisch.

// Not what OP needs 
pos=getc(stdin) != EOF 
pos=(getc(stdin) != EOF) 

Verwenden Sie stattdessen ()

while((pos=getc(stdin)) != EOF) 

Verwenden int ch die Werte von fgetc() zurück unterscheiden, die Werte im Bereich unsigned char und EOF sind. In der Regel 257 verschiedene, zu viele für eine char.

int main() { 
    unsigned long character_count = 0; 
    unsigned long word_count = 0; 
    unsigned long line_count = 0; 
    unsigned long letter_count = 0; 
    int pos; 

    while((pos = getc(stdin)) != EOF) { 
    ... 

Vielleicht möchten Sie Ihre Wortzählimpuls Strategie überprüfen. @Tony Tannous


Für mich würde ich ein „Wort“ wie jedes Mal, wenn ein Brief aufgetreten zählen, die keine nicht-Brief folgte. Dies vermeidet ein Problem @Tony Tannous und andere Probleme. Ebenso würde ich eine Zeile als irgendein Zeichen zählen, das einem '\n' oder dem allerersten folgte und irgendeine Postschleifenberechnung vermeidet. Dies behandelt das von Weather Vane kommentierte Problem.

Es erscheint auch 39 ist ein Brief zählen und nicht eine Anzahl von Zeichen @BLUEPIXY.
vorschlagen <ctype.h> Funktionen für den Buchstaben-ness (isapha())

int previous = '\n'; 
while((pos = getc(stdin)) != EOF) { 
    character_count++; 
    if (isalpha(pos)) { 
    letter_count++; 
    if (!isalpha(previous)) word_count++; 
    } 
    if (previous == '\n') line_count++; 
    previous = pos; 
} 

printf("characters %lu\n", character_count); 
printf("letters %lu\n", letter_count); 
printf("words %lu\n", word_count); 
printf("lines %lu\n", line_count); 
+0

Mit diesen zwei Korrekturen gibt der Code '40 11 5 '(mit einem letzten Zeilenumbruch) und' 40 10 4 '(ohne einen letzten Zeilenumbruch), aber der OP erwartete den Ausgang' 39 9 4 '. –

+0

@WeatherVane Ja, OP-Zeichen (Buchstaben), Zeilen- und Wortzählung müssen ebenfalls funktionieren. Schlage Code vor. – chux

+0

Endlich! Aber schwierig zu kopieren/einfügen und kompilieren mit den inkonsistenten Variablennamen. –

Verwandte Themen