找到出现次数更多的字符串(单词)

时间:2013-12-22 02:54:06

标签: c

我必须给出一个数字x,然后写出x个字符串(单词)。 我必须找到一个写作次数最多的那个。 它工作,但当我尝试从文件中读取它不。 例如,如果我执行a.out''<'文件和文件就像:

  1. 5
  2. 你好
  3. 世界
  4. 你好
  5. 确定
  6. 所有这些都在不同的行中,每个字符串在不同的行上工作,我打印你好,但如果很多字符串在一行中就像一个文本它不会工作(你好是的话,你好e.t.c ...

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void)
    {
        char **str;
        int n,i,j,y;
        int count=0;
        printf("Give a nubmer : \n");
        scanf("%d", &n);
        str = (char **)malloc(n *(sizeof(50)));
        for(i=0; i<n+1; i++)
                str[i] = (char *)malloc(50);
        printf("Give n strings : \n");
        for(i=0; i<n+1; i++)
        {
                gets(str[i]);
        }
        for(i=0; i<n+1; i++)
        {
                for (j=i+1;j<n+1;j++)
                {
                        if(strcmp(str[i],str[j])==0)
                        {
                                count++;
                        //      i++;
                                y=i;
                        }
                }
        }
        printf("\n%s\n",str[y]);
    }
    

    是我使用gets而不是fgets的概率吗?

1 个答案:

答案 0 :(得分:1)

请考虑以下事项:

#define NUM_STRINGS (10)

int strListCompare(const void *p1, const void *p2)
{
    const char **str1 = p1;
    const char **str2 = p2;
    return strcmp(*str1, *str2);
}

int main(void)
{
    char *strList[NUM_STRINGS] = {
                                     "dog", "cat", "cat", "bat", "cat", 
                                     "cat", "dog", "bat", "dog", "bat"
                                 };

    qsort(strList, NUM_STRINGS, sizeof(char *), strListCompare);

    char *curStr = strList[0], *maxStr = strList[0];
    int curCount = 0, maxCount = 0;

    for(int i = 0; i < (NUM_STRINGS - 1); i++)
    {
        curCount++;

        if((strcmp(strList[i], strList[i + 1]) != 0) && (curCount > maxCount))
        {
            maxCount = curCount;
            maxStr = strList[i];
            curCount = 0;
        }
    }

    printf("The winner! \"%s\" (%d occurrences)\n", maxStr, maxCount);
    return 0;
}

执行上述程序会产生以下输出:

  

获胜者! “猫”(4次出现)

这是逻辑:

  

首先,strList未排序。我对它进行排序以帮助确定最常出现的字符串。在我扫描strList之前,我假设第一个元素是最常出现的字符串。现在,我扫描strList并计算出现次数。如果下一个字符串与当前字符串相同,我会增加curCount。只要下一个字符串与当前字符串不同,我就会将curCountmaxCount进行比较。如果curCount大于maxCount,我发现了最常出现的新字符串。我将curCount和当前字符串分别设置为maxCountmaxStr。当循环结束时,maxCountmaxStr将拥有最多出现的字符串。