2017-11-02 10 views
-2

작은 코드 단편입니다.왜 내 wc 구현은 잘못된 단어 수를 제공합니까?

while((c = fgetc(fp)) != -1) 
    { 
     cCount++; // character count 
     if(c == '\n') lCount++; // line count 
     else 
     { 
      if(c == ' ' && prevC != ' ') wCount++; // word count 
     } 
     prevC = c; // previous character equals current character. Think of it as memory. 
    } 

는 지금이 위의 코드 조각이 포함 된 파일을 wc 실행할 때 (같이), 나는 48 개 단어를 얻고 있지만이 같은 입력 데이터에 내 프로그램을 사용할 때, 나는 59 개 단어를 얻고있다.

정확히 어떻게 wc와 같은 단어 개수를 계산합니까?

+1

는 이러한 결과뿐만 아니라 기반으로 입력을 게시하는 것이 도움이 될 수 있습니다. 당신은 단어가 항상 공백으로 끝난다 고 가정하는 것 같습니다. 입력의 끝, \ t와 같은 다른 공백 문자 또는 개행 문자가 있다면? – GoodDeeds

+0

입력 파일의 내용을 게시 할 수 있습니까? –

+0

fgetc가 -1을 반환하지 않으면 EOF를 반환합니다. – jarmod

답변

0

공백 만 검사하는 대신 \ t \ n 공백과 같은 이스케이프 시퀀스를 확인해야합니다.

올바른 결과를 얻을 수 있습니다. 당신은 올바른 결과를 줄 것이다

if(isspace(c) && !(isspace(prevC)) wCount++; 

이에 <ctype.h>

변경 라인

if(c == ' ' && prevC != ' ') wCount++; 

에서 isspace와()를 사용할 수 있습니다. 포함 할 것을 잊지 마세요. <ctype.h>

+0

int isspace (int c); c가 공백인지 아닌지 확인하는 데 사용됩니다. –

1

공백이 아닌 것은 유효한 단어로 취급합니다. 이것은 개행 문자 뒤에 공백 문자가 오는 것을 의미하며 입력 (코드 스 니펫)이 들여 쓰기되어 있기 때문에 여분의 단어를 얻을 수 있습니다. "브라이언 W 커니 핸과 데니스 M 리치 :

while((c = fgetc(fp)) != EOF) 
{ 
    cCount++; 
    if (c == '\n') 
     lCount++; 
    if (isspace(c) && !isspace(prevC)) 
     wCount++; 
    prevC = c; 
} 
1

는이 책에서 원하는 함수의 예입니다 : 당신은 ' '에있는 문자를 비교하는 대신 공백를 확인하기 위해 isspace를 사용해야합니다

Ansi C 프로그래밍 언어 ". 저자가 말했듯이 : 이것은 유닉스 프로그램 wc의 간략한 버전이다. 단지 단어를 계산하기 위해 변경이 같다 :

#include <stdio.h> 

#define IN 1 /* inside a word */ 
#define OUT 0 /* outside a word */ 

/* nw counts words in input */ 
main() 
{ 
    int c, nw, state; 
    state = OUT; 
    nw = 0; 
    while ((c = getchar()) != EOF) { 
    if (c == ' ' || c == '\n' || c == '\t') 
     state = OUT; 
    else if (state == OUT) { 
     state = IN; 
     ++nw; 
    } 
    } 
    printf("%d\n", nw); 
} 
+0

In 문 - 'if (c ==' '|| c =='\ n '|| c ='\ t ')''\ t'' equality check 대신에'c'를 사용한다. –

+0

지금 고쳐 주신 덕분에 – Chatz

+0

답해 주셔서 감사합니다. 그러나 어떤 이유로이 알고리즘은 일부 파일에서는 작동하지 않습니다.예를 들어 컴파일 된 C 실행 파일과 비교해 본 결과 실제 wc와는 다른 값을 얻고 있습니다. 어떤 아이디어? – theprogrammer094

0

당신은 할 수 있습니다 :

int count() 
{ 
    unsigned int cCount = 0, wCount = 0, lCount = 0; 
    int incr_word_count = 0; 
    char c; 
    FILE *fp = fopen ("text", "r"); 

    if (fp == NULL) 
    { 
      printf ("Failed to open file\n"); 
      return -1; 
    } 

    while((c = fgetc(fp)) != EOF) 
    { 
      cCount++; // character count 
      if(c == '\n') lCount++; // line count 
      if (c == ' ' || c == '\n' || c == '\t') 
        incr_word_count = 0; 
      else if (incr_word_count == 0) { 
        incr_word_count = 1; 
        wCount++; // word count 
      } 
    } 
    fclose (fp); 
    printf ("line : %u\n", lCount); 
    printf ("word : %u\n", wCount); 
    printf ("char : %u\n", cCount); 
    return 0; 
}