2013-06-22 86 views
0

OK的傢伙,所以我寫了這個程序單詞統計程序計數超過它應該

#include <stdio.h> 

/* count words */ 

main() 
{ 

    int c, c2; 
    long count = 0; 

    while ((c = getchar()) != EOF) 
    { 
     switch(c) 
     { 
     case ' ': 
     case '\n': 
     case '\t': 
      switch(c2) 
      { 
      case ' ': 
      case '\n': 
      case '\t': 
       break; 
      default: 
       ++count; 
      } 
     } 
     c2 = c; 
    } 
    printf("Word count: %ld\n", count); 
} 

它計算的話從一個輸入,你可以看到。所以我寫了一個名爲A-文本只有

a text 

,我在Ubuntu提示

./cw < a-text 

寫道,它寫道

Word count: 2 

那麼,到底是什麼?它不應該只計數1,因爲在第二個單詞之後沒有標籤,也沒有新的行和空格,只有EOF。爲什麼會發生?

+0

你是如何寫入文件會發生什麼?我剛剛做了'printf'文本「> a-text',你的程序報告:'字數:1'。我的猜測是,你的'a-text'文件末尾可能還有一個新行。 – Th3Cuber

+1

@ Th3Cuber不,我打開gedit,寫下「一個文本」並將其保存爲一個文本。我已經檢查過了,文本結尾處沒有新的行。我試過用其他文件,它總是給出正確的字數 – rodrigoms

+2

@ user2510987 IIRC gedit會自動在文本的末尾添加一個換行符,除非您在首選項中明確禁用該功能。 – Will

回答

0

爲什麼不計算單詞而不是空格?那麼當輸入以空格結束時,你就沒有問題了。

#include <ctype.h> 
#include <stdio.h> 

int main(int argc, char**argv) { 
    int was_space = 1; 
    int c; 
    int count = 0; 
    while ((c = getchar()) != EOF) { 
     count += !isspace(c) && was_space; 
     was_space = isspace(c); 
    } 
    printf("Word count: %d\n", count); 
    return 0; 
} 
0

讓我們看看與 「文本」

after the first iteration, c2 == 'a', count remains 0 
now comes c == ' ' c2 is still 'a', so count == 1, c2 becomes == ' ' 
now comes c == 't' c2 is still ' '. so count remains == 1 
... 
now comes c == '\n' c2 is the last 't'. count becomes == 2 

督察

"a text\n" 
    ^----^-------- count == 1 
     | 
     +-------- count == 2 
+0

但爲什麼在\ n如果它是一個文本文件?或者所有文本文件都以\ n結尾? – rodrigoms

+0

@ user2510987爲什麼最後不會有\ n? \ n表示一行的結尾,而文本文件通常由行組成。 –

+0

@ user2510987它取決於您如何創建文件,如果您在關閉該行的同時在該行的末尾寫入了行並按Enter,那麼會在結尾處有一個\ n –