2014-05-04 42 views
0

我写了这段代码,但看起来很糟糕。此功能打印每个单词重复多少次。有没有另一种方法可以做到简单易懂的相同功能?如何从C上的文本中统计不同的单词?

int diffrentwords(FILE *myinput){ 
    int i,j,words[40],difwords=0; 
char text[40][40]; 
char a; 

rewind(myinput); 
for(i=0;i<40;i++){ 
    words[i]=0; 
    for(j=0;j<40;j++) 
     text[i][j]=' '; 
} 
    for (i=0;i<40;i++){ 
    if(feof(myinput)) 
     break; 
    for(j=0;j<40;j++){ 
     a=fgetc(myinput); 
     if(a!=' ') 
      text[i][j]=a; 
     else{ 
      text[i][j]='\0'; 
      break; 
     } 
    } 
} 
text[i][0]='\0'; 
i=0; 

for(i=0;text[i][0]!='\0';i++) 
    for(j=i+1;text[j][0]!='\0';j++) 
     if(text[j][0]!=' ' && !(strcmp(text[i],text[j]))){ 
      words[i]++; 
      text[j][0]=' '; 
     } 
for(i=0;text[i][0]!='\0';i++) 
    if(text[i][0]!=' '){ 
     printf("%s \t %d\n",text[i],words[i]+1); 
     difwords++; 
    } 
printf("\n"); 
return difwords; 

}

+0

评论有助于使代码更易于理解,在索引0匹配任何单词索引9字算作是独一无二的。 – AsksAnyway

+0

文件中的单词是否在一行上? – user3386109

+0

@ user3386109是的,我想! – user3599630

回答

1

第1步是读取文件中的所有单词。 fscanf可用于此目的。 fscanf的好处在于它可以读取整个单词,处理所有的空白问题,并检测文件结束。因此,要读取文件的代码看起来像这样

int count; 
char word[40][40]; 
FILE *fp; 

if ((fp = fopen("input.txt", "r")) == NULL) 
    exit(1); 

for (count = 0; count < 40; count++) 
{ 
    if (fscanf(fp, "%39s", word[count]) != 1) 
     break; 
} 

fclose(fp); 

第二步是要弄清楚有多少独特的话也有在文件中。如果数组中的所有单词都不相同,则该单词被计为唯一。举例来说,如果它没有通过8

int i, j, unique, repeated; 

unique = 0; 
for (i = 0; i < count; i++) 
{ 
    repeated = 0; 
    for (j = 0; j < i; j++) 
     if (strcmp(word[i], word[j]) == 0) 
     { 
      repeated = 1; 
      break; 
     } 

    if (!repeated) 
    { 
     unique++; 
     printf("%s\n", word[i]); 
    } 
} 

printf("The number of unique words is %d\n", unique); 
+0

金币接受!谢谢! – user3599630

+0

@ user3599630如果您认为此问题/答案有助于未来的学生/初学者,您可以投票! – user3599630

0

首先,你应该有一个功能,目的只有一个。

您不能拥有从文件中读取并进行计数的功能。 (单一责任)

二,让我们重新思考一下......你会有一些从文件中逐行返回的函数。

然后,你将有另一个函数从第一个函数中读取并尝试查找空间字符,以便它可以考虑一个单词。

另一个功能将每个单词和一些array of struct {char* word; int count;}搜索,如果发现的话,它增加计数,否则将其设置为1

通过这一点,你将有更多的组织和可读的代码。

相关问题