0

我几乎完成了我的字谜求解程序,我在其中输入了两个字符串并得到它们是否是彼此的字谜的结果。对于这个例子,我使用“收到的付款”和“每一分钱都付给我”。

我遇到的问题是当我输出 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");
    }
}
4

2 回答 2

1

那是因为您的计数包含非空格字符的计数,但您将字符串与空格一起保留。

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

要修复它,您需要遍历字符串的所有字符,并且只计算字母数字字符。

于 2012-02-27T17:23:13.907 回答
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函数中返回任何东西。

于 2012-02-27T17:38:20.547 回答