我想找到频繁的信件

时间:2015-12-02 14:27:39

标签: c

在那个程序中我将给出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;
}

2 个答案:

答案 0 :(得分:2)

您正在打印字符串(%s)而不是字符(%c)。

试试这个

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

答案 1 :(得分:1)

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

我估计如果你的名字是Alice,Bob,Charlie,Dora,Emily和Frank,你希望输出为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;
}