2016-08-05 12 views
0

Ich versuche, ein Programm in C zu schreiben, um die Länge der Wörter zu drucken, die über getchar() eingegeben werden. Hier ist der Code:Länge der Wörter von getchar()

#include<stdio.h> 

#define IN 1 
#define OUT 0 

int main() 
{ 
int c, chars, state, i; 
int nlength[20]; 

state = OUT; 
chars = 0; 

for (i = 0; i < 20; ++i){ 
    nlength[i] = 0; 
} 


while ((c = getchar()) != EOF){ 
    if (c != ' ' && c != '\t' && c != '\n'){ 
     state = IN; 
     ++chars; 
    } 

    else if (state == OUT){ 
      ++nlength[chars]; 
      chars = 0; 
    } 
} 
if (c == EOF){ 
    ++nlength[chars]; 
} 

printf("\nLength of words = "); 

for (i = 0; i < 20; ++i){ 
    printf(" %d", nlength[i]); 
} 

printf("\n"); 
} 

Es sollte ausgeben, für ein Beispiel einer Eingabe von "aaa aaa",: 0 0 0 2 0 0 0 .... Es gibt jedoch so etwas wie 0 0 0 0 0 0 1 0 0 ... aus. Kann mir jemand sagen, was damit nicht stimmt?

+4

Dies ist die perfekte Gelegenheit, einen Debugger zu verwenden, um den Code zu verfolgen und sehen, was wirklich los ist. Mach es, es macht Spaß! :-) – alk

+0

@someuser was meinst du – smudge49

+0

Zuerst, warum brauchen Sie State Variable, wenn Sie es nicht verwenden? Zweitens erhöhen Sie nicht die Länge des aktuellen Wortes, sondern einen Wortindex im Array. – someuser

Antwort

1

In Ihrem Code state wird nie zu OUT geändert, so dass die folgenden Zeilen:

else if (state == OUT){ 
     ++nlength[chars]; 
     chars = 0; 
} 

niemals ausgeführt.

Es gibt auch mehrere Orte, die verdächtig aussehen. Z.B. Sie prüfen nie, ob Array-Grenzen vorhanden sind. Sie brauchen auch keine state Variable, Sie können nur überprüfen, ob .

Hier ist der Code mit einigen Änderungen:

#include <stdio.h> 
// we can use isspace function from ctype.h 
#include <ctype.h> 

#define MAX_LEN 20 

int main() { 
    int c; 
    int chars = 0; 
    // this way we don't have to zero the array explicitly 
    int nlength[MAX_LEN] = {0}; 

    while ((c = getchar()) != EOF) { 
    if (!isspace(c)) 
     ++chars; 
    else { 
     // if chars == 0 we increment nlength[0] 
     // which is not used anyway 
     if (chars < MAX_LEN) 
     ++nlength[chars]; 
     chars = 0; 
    } 
    } 

    // if chars == 0 we increment nlength[0] 
    if (chars < MAX_LEN) 
    ++nlength[chars]; 

    // set 0-length words element to zero 
    nlength[0] = 0; 

    printf("\nLength of words = "); 

    for (int i = 0; i < MAX_LEN; ++i) { 
    printf(" %d", nlength[i]); 
    } 

    printf("\n"); 
} 
+0

@lakov Davydov Vielen Dank dafür, es hat wirklich alles geklärt. – smudge49

Verwandte Themen