2015-12-02 69 views
0

在那个程序我会给出6个名字,然后我想从整个名字中找到频繁的字符。我试过这个,但是它并没有显示出所有名字中的字符,但整个名字都保留了下来。我想找到频繁的字母

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define max 6 

int main() 
{ 


    char name[max][20]; 
    char *ptrnaame; 
    int i,j,len, cnt, k, next, occurence=0, maximum=0; 
    char *index_max=NULL; 


    ptrname=name[0]; 

    for(i=0; i<max; i++) 
    { 
     printf("Give the name :"); 
     gets(name[i]); 
     len=strlen(name[i]); 
     while(len>20) 
     { 
      printf("Give the name again:"); 
      gets(name[i]); 
     } 
    } 

    for(i=0; i<max; i++) 
    { 
     occurence=0; 
     for(j=i; j<20; j++) 
     { 
      if(!strcmp(*(name+i), *(name+j))) 
      { 
       occurence++; 
      } 
     } 
     if(occurence>maximum) 
     { 
      maximum=occurence; 
      index_max=*(name+i); 
     } 
    } 
    if(index_max!=NULL) 
    { 
     printf("The most frequent character is: %s with %d occurences", index_max, maximum); 
    } 
    system("pause"); 
    return 0; 
} 
+0

什么逻辑使用计数频率? – user2697817

+1

如果你想知道哪个字母最常出现,你必须跟踪所有字母的出现。这意味着你需要一系列的计数,而不仅仅是一个标量。如果你只想计算字母的出现次数,你不必存储名字,只需处理它们,这些字母就是数字,因为它们来了。 –

回答

2

要打印的,而不是一个字符(%c)的字符串(%s)。

试试这个

printf("The most frequent character is: %c with %d occurences", index_max[0], maximum); 
+0

它给了我一个字母,但它不是频繁的字母 – user5624945

+1

你正在使用'strcmp()'。这用于比较字符串,而不是字符。试试这个:'if(*(name + i)== *(name + j))'。 –

+0

这只是比较两个指针。您需要再次取消引用以获取字符值。使用索引会更好。 – user2697817

1

你的程序有其他人已经指出的错误。最大的错误是程序的逻辑不正确。

我认为如果你的名字是爱丽丝,鲍勃,查理,多拉,艾米莉和弗兰克,你希望输出为E,这种输出最常出现在所有名字中,即4次。

如果是这样,那么你必须指望所有角色的出现。有很多可能的方法来做到这一点。您可以遍历所有字母,然后遍历所有单词和字母,并在字母匹配时递增计数。这很直接,但效率很低,因为你处理数据26次。

更好的方法可能是为字母保留一组计数。然后你需要检查每个单词和每个字母只有一次:看字符,如果它是一个字母,增加相应的计数。

一个不错的副作用是,现在你不需要存储名称了。当用户键入它们时,让这些字母从stdin流入,处理它们并立即忘记它们。你只对每封信的总数感兴趣。

不存储名称也意味着您不再遇到内存管理问题。例如,在你的原始代码中,你想循环遍历从0到20的每个单词中的字母,但是这个单词中不一定有很多字母。 char缓冲区仅保存有效输入,直到终止空字符;之后的一切都是垃圾。你也错误地使用字母索引作为单词的索引,其中只有六个。这会导致内存访问不良。

下面是一个示例实现,让你输入尽可能多的名字,只要你喜欢:

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

int main() 
{ 
    int count[26] = {0};  // counts for 26 letters 
    char line[80];    // line buffer 
    int i; 

    puts("[Please enter text. A blank line or Ctrl-D/Z ends input.]"); 

    while (fgets(line, sizeof(line), stdin)) { 
     int nonspace = 0; 

     for (i = 0; line[i] != '\0'; i++) { 
      int c = line[i]; 

      if ('A' < c && c <= 'Z') count[c - 'A']++; 
      if ('a' < c && c <= 'z') count[c - 'a']++; 
      if (c != ' ' && c != '\n') nonspace++; 
     } 

     if (nonspace == 0) break; 
    } 

    int imax = 0; 

    for (i = 1; i < 26; i++) { 
     if (count[i] > count[imax]) { 
      imax = i; 
     } 
    } 

    printf("Most frequent character is %c (occurs %d times).\n", 
     'A' + imax, count[imax]); 

    return 0; 
}