Anagram Solver,数组[26]无法正常工作

时间:2012-02-27 17:10:18

标签: c anagram

我差不多完成了我的anagram求解器程序,我输入了两个字符串,得到的结果是它们是否是彼此的字谜。对于这个例子,我使用'收到付款'和'每分钱付给我'。

我得到的问题是当我输出letterCount数组时,letterCount1不正确(它不认为有一个字符'd'但是有。)但是letterCount2是正确的。

任何人都可以看到这个问题因为我完全感到困惑吗?

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

int checkAnagram(char string1[], char string2[])
{
        int i;
    int count = 0, count2 = 0;
    int letterCount1[26] = {0};
    int letterCount2[26] = {0};

    for(i = 0; i < strlen(string1); i++)
    {
        if(!isspace(string1[i]))
        {
            string1[i] = tolower(string1[i]);
            count++;
        }
    }

    for(i = 0; i < strlen(string2); i++)
    {
        if(!isspace(string2[i]))
        {
            string2[i] = tolower(string2[i]);
            count2++;
        }
    }

    if(count == count2)
    {
        for(i = 0; i < count; i++)
        {
            if(string1[i] >='a' && string1[i] <= 'z')
            {
                letterCount1[string1[i] - 'a'] ++;
            }

            if(string2[i] >='a' && string2[i] <= 'z')
            {
                letterCount2[string2[i] - 'a'] ++;
            }
        }

        printf("%s\n", string1);

        for(i = 0; i < 26; i++)
        {
            printf("%d ", letterCount1[i]);
            printf("%d ", letterCount2[i]);
        }
    }
}

main()
{
    char string1[100];
    char string2[100];

    gets(string1);
    gets(string2);

    if(checkAnagram(string1, string2) == 1)
    {
        printf("%s", "Yes");
    } else
    {
        printf("%s", "No");
    }
}

2 个答案:

答案 0 :(得分:1)

那是因为你的计数包含非空格字符的数量,但你保留字符串的空格。

例如,字符串“hello world”有11个字符,但是如果你通过循环运行它,你的计数将是10(你不计算空间)。但是,当您稍后查看字符串并计算每个字母的外观时,您将查看前10个字符,因此完全忽略了最后一个字符 - “d”。

要解决此问题,您需要查看字符串的所有字符,并且只计算字母数字字符。

答案 1 :(得分:0)

我为你修好了:

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

int checkAnagram(char string1[], char string2[])
{
    int i;
    int count = 0, count2 = 0;
    int letterCount1[26] = {0};
    int letterCount2[26] = {0};
    int len1 = strlen(string1);
    int len2 = strlen(string2);

    for(i = 0; i < len1; i++)
    {
        if(!isspace(string1[i]))
        {
            string1[i] = tolower(string1[i]);
            count++;
        }
    }

    for(i = 0; i < len2; i++)
    {
        if(!isspace(string2[i]))
        {
            string2[i] = tolower(string2[i]);
            count2++;
        }
    }

    if(count == count2)
    {
        for (i=0; i<len1; i++)
            if (!isspace(string1[i]))
                letterCount1[string1[i]-'a']++;
        for (i=0; i<len2; i++)
            if (!isspace(string2[i]))
                letterCount2[string2[i]-'a']++;

        int flag = 1;
        for(i = 0; flag && i < 26; i++)
            if (letterCount1[i] != letterCount2[i])
                flag = 0;
        return flag;
    }
    return 0;
}

main()
{
    char string1[100];
    char string2[100];

    gets(string1);
    gets(string2);

    if(checkAnagram(string1, string2) == 1)
    {
        printf("%s", "Yes");
    } else
    {
        printf("%s", "No");
    }
}

首先,不要在循环内计算字符串的长度。我将它们提取到len1len2变量中。

其次,你的循环错了!你不应该达到count,你应该达到那个字符串的长度。

第三,你没有从checkAnagram函数返回任何内容。