2014-01-30 58 views
0

因此,對於C類的介紹,我們必須編寫一個程序來計算文件中的行數,字符數和單詞數。在程序中,單詞被定義爲以字母開頭的一系列字母,數字和撇號。出於某種原因,用於計算單詞的邏輯對我來說不起作用,也許是因爲我對C很陌生,或者因爲我在編寫邏輯方面一直很糟糕。我的代碼現在通過 hey whats up\n hey what's up\n hey wh?ts 'p\n 傳回3行,31個字,40個字符。感謝任何幫助,我知道這是一個超級跛腳的問題,它只是讓我瘋了。字數邏輯

這裏是我的代碼:

#include <stdio.h> 
typedef enum yesno yesno; 
enum yesno { 
    YES, 
    NO 
}; 

int main() { 
    int c;   // character 
    int nl, nw, nc; // number of lines, words, characters 
    yesno inword; // records if we are in a word or not 
    yesno badchar; 
    // initialize variables: 
    badchar=NO; 
    inword = NO; 
    nl  = 0; 
    nw  = 0; 
    nc  = 0;` 

    while ((c = getchar()) != EOF) { 
     ++nc; 
     if (c == '\n') 
      ++nl; 
     if (c == ' ' || c == '\n' || c == '\t') 
      inword = NO; 
     else if (inword == NO) { 
      inword = YES; 
     } 
     while (inword == YES){ 
      if ((c<'A' || c>'Z')||(c<'a'||c>'z')||(c<'0'|| c>'9')){ 
       inword= NO; 
       //badchar = YES; 
      } 
      if ((c<'A' || c>'Z')||(c<'a'||c>'z')|| (c<'0'|| c>'9') ||(c!= '\'')){ 
       nw=nw; 
       inword = NO; 
       //badchar=YES; 
      } 
      if(badchar==NO){ 
       nw++; 
       badchar=NO; 
       inword= NO; 
      } 
     } 
    } 
    printf("%d %d %d\n", nl, nw, nc); 
} 
+0

您能否修復縮進/格式化?您的代碼目前很難閱讀。 – Macattack

+0

我想,但由於某些原因,在我的電腦上輸入代碼的方法似乎非常笨拙。我基本上只是粘貼代碼,然後按下[空格]四行每行。 –

+0

單詞計數的問題在於,每次在單詞中使用另一個字母時,都會增加單詞數量。當你從一個詞改變成一個詞時,你只需要增加它。 – Macattack

回答

0

我從來沒有編程C.但是,當我在其他語言編寫的同樣的事情,這不是太強硬。對於字數統計,請將空格替換爲「\ n」,然後使用空格作爲分隔符將字符串拆分爲數組,最後統計數組中元素的數量。類似的事情來獲得行數:使用「\ n」作爲分隔符將字符串拆分爲數組,然後計算數組中元素的數量。

+0

不幸的是,我不能在C中聲明數組,但它不像Java那樣簡單,並且使空間分隔對我來說在我們的c類中也同樣棘手。 –

1

的一個問題是這樣的條件:

if ((c<'A' || c>'Z')||(c<'a'||c>'z')||(c<'0'|| c>'9')){ 
    inword = NO; 

考慮c如值:

  • 'A':這將是小於'a',所以你會切換到inword = NO
  • 'a':這將大於'Z',因此您將切換到inword = NO
  • '0':這將會小於'A',所以您將切換到inword = NO

您需要將集條件之間使用&&

if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') && (c < '0' || c > '9')){ 

或者,更好的,你可以使用宏/功能從<ctype.h>

if (!isupper(c) && !islower(c) && !isdigit(c)) 

但可以簡寫到:

if (!isalnum(c)) 

您還需要查看其他測試。還可能有其他問題,但我根本沒有回顧其餘的代碼。