2016-03-12 123 views
0

我與這個程序有問題,我希望它只在輸入中顯示一次單詞,並在每次出現時計數,但它顯示輸入的每個單詞。計數相似單詞

例如,如果我進入

「這應該也只是出現出現一次」

的話,我想程序輸出

this 1 
should 1 
only 2 
appear 2 
once 1 

任何幫助,將不勝感激。

#include <stdio.h> 
#include <string.h> 

#define ROW 1000 
#define COL 50 

int read_input(char *str, int n); 

int main(void) 
{ 
    char str[ROW]; 
    char stringSeperate[ROW][COL] = { }; 
    const char *s= " ,.!"; 

    char *p; 
    int freq[ROW]; 
    int i = 0; 
    int wordCount = 0; 
    int pos = 0; 

    read_input(str, ROW); 

    p = strtok(str,s); 
    i = 1; 

    while(p !=NULL) { 
     wordCount = i; 
     for(i = 0; i < wordCount; i++) { 
      if (strcmp(p, stringSeperate[i]) != 0) 
       pos = 1; 
      else 
       pos = i; 
     } 
     if (pos == 1) { 
      strcpy(stringSeperate[i], p);   
      freq[i++]++; 

     } 
     else 
      freq[pos]++; 
     p = strtok(NULL,s); 
    } 

    for (i = 1; i <= wordCount; i++) { 
     printf("Word: %s\t Number: %d\n",stringSeperate[i], freq[i]); 
    } 

    return 0; 
} 

int read_input(char *str, int n) 
{ 
    int ch, i = 0; 

    while((ch = getchar()) != '\n') { 
     if (i < n) { 
      *str++ = ch; 
      i++; 
     } 
    } 
    *str = '\0'; 
    return i; 
} 
+1

注意:如果你不太理解,你應該從索引0開始使用數組。 – MikeCAT

回答

1

您通過具有自動存儲持續時間,這是不確定的使用未初始化的變量freq值調用未定義行爲

初始化它像int freq[ROW] = {0};

你也應該

1。改變stringSeperate初始化標準:空initlalizer是不允許的,所以它應該像

char stringSeperate[ROW][COL] = {{0}}; 

2。刪除多餘的印刷相匹配所需的輸出:改變

printf("Word: %s\t Number: %d\n",stringSeperate[i], freq[i]); 

printf("%s %d\n",stringSeperate[i], freq[i]); 

3。檢查輸入的長度以避免導致緩衝區溢出。更改

if (i < n) { 
read_input

if (i < n - 1) { 

,以騰出空間給終止空characteer。