2016-03-21 7 views
0

Wie der Titel sagt, im Word-Count-Clone-Programm in C schreiben, aber zählt nicht richtig in einem der Fälle. Ich habe Datei und das Programm funktioniert gut, .txt, aber wenn ich den folgenden Befehl verwendenWord Count Programm in C zählt nicht richtig

linux>./wordcountclone < file.txt 

es nur die Hälfte die Worte zählt. Mache ich etwas falsch? , wenn ich zum Beispiel verwenden

linux>./wordcountclone file.txt 

oder

linux>./wordcountclone -l -d file.txt 

funktioniert gut. geht hier die Funktion im

void fileO(FILE * name, int car, int word, int lin, int dig){ 
    int c , nl, np, nc, nd, state; 
    state = OUT; 
    nl = nc = nd = 0; 
    np = -1; 
    c = fgetc(name); 
    while (c != EOF){ 
     c = fgetc(name); 
     nc++; 
    if(nc > INT_MAX) 
     return; 
    if (c == '\n') 
     nl++; 
    if (c > 47 && c < 58) 
     nd++; 
    if (c == ' ' || c == '\n' || c == '\t') 
     state = OUT; 
    if (state == OUT) { 
     state = IN; 
     np++; 
    } 
} 


    if(lin !=0) 
     printf("lines %d ", nl);  
    if(word != 0) 
     printf("words %d ", np); 
    if(dig !=0) 
     printf("digits %d ", nd); 
    if(car != 0) 
     printf("chars %d ", nc); 
    printf("\n"); 

}

und die TXT-Datei, die i

the cat sat on the mat 
the dog jumped over the moon 
+5

Konsistente und lesbare Einrückung ist wichtig wenn Sie hier einen Code eingeben. So wie es ist, haben Sie es schwer zu lesen gemacht. – crashmstr

+1

Wie läuft es, wenn es funktioniert? – Mawg

+1

Könnten Sie Ihren Beispieltext hinzufügen? – xvan

Antwort

2

Mindestens zwei Probleme hier hat den folgenden Text bin mit:

  • Sie überspringen immer das erste Zeichen tun c = fgetc(name); zweimal in Folge - eine Bef Erz while und dann in der Schleife.

  • Die state Logik ist falsch - wenn Sie dies für eine Datei ausführen, die nur Leerzeichen enthält, zählen Wörter immer noch.

Auch ein paar Vorschläge:

  • statt if (c > 47 && c < 58) Sie if ('0' <= c && c <= '9') oder benutzen Sie tun könnten isdigit()

  • Verwendung isspace() Auf Leerzeichen überprüfen

+0

funktioniert immer noch nicht, ich denke, wenn ich die Umleitung (<) im Terminal verwende (linux> ./ wordcountclone Funnymemes

+0

Wenn Sie Umleitung machen, erhalten Sie die Eingabe über '' 'stdin'''. Stellen Sie sicher, dass Sie diese Funktion als Eingabestream an Ihre Funktion übergeben. – dekkard

+0

Sorry, aber ich verstehe nicht, wo überlasse ich das? in der Datei * Name? – Funnymemes