【问题标题】:Anagram Solver, array[26] not working correctly字谜解算器,数组 [26] 无法正常工作
【发布时间】:2012-03-17 04:02:10
【问题描述】:

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

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

【问题讨论】:

  • count 和 count2 的答案是否正确?
  • 你不会从checkAnagram返回任何东西

标签: c anagram


【解决方案1】:

那是因为您的计数包含非空格字符的计数,但您保留了带有空格的字符串。

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

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

【讨论】:

  • 我应该在哪个循环中遍历所有字符?你是说我应该在获取“count”时更改第一个循环还是使用“letterCount”的其他循环?
【解决方案2】:

我帮你修好了:

#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函数返回任何东西。

【讨论】:

  • 非常感谢,增加字符串的长度而不是 alpha 字符是有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
相关资源
最近更新 更多