首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C- Anagram函数

C- Anagram函数
EN

Stack Overflow用户
提问于 2022-07-26 09:37:03
回答 1查看 95关注 0票数 -3

我有一个anagram函数,它的工作方式与我想要的不一样。

例如,将正确地工作,以便函数返回1:

  • is_anagram("a bc", "Cab")
  • is_anagram("a12+-", "1a2")

但是函数不正确地返回1,用于:

  • is_anagram("1a3", "1a +=")

守则是:

代码语言:javascript
复制
#include <ctype.h>
#include <stdio.h>

int is_anagram(char *s1, char *s2) {
    // 2 Empty Num Arrays
    int s1_count[99] = {0};
    int s2_count[99] = {0};
    int c = 0;    
    while (s1[c] != '\0') 
    {
        if (isupper(s1[c])) 
        {
            s1_count[tolower(s1[c]) - 'a']++;
        }
        else 
        {
            s1_count[s1[c] - 'a']++;
        }
        c++;
    }
    c = 0;
    while (s2[c] != '\0') 
    {
        if (isupper(s2[c])) 
        {
            s2_count[tolower(s2[c]) - 'a']++;
        }
        else 
        {
            s2_count[s2[c] - 'a']++;
        }
        c++;
    }
    for (int i = 0; i < 26; i++) 
    {
        if (s1_count[i] != s2_count[i]) 
        {
            return 0;
        }
    }
    return 1;
}

int main(void)
{
    printf("%d\n", is_anagram("a bc", "Cab")); // expected to print 1
    printf("%d\n", is_anagram("a12+-", "1a2")); // expected to print 1
    printf("%d\n", is_anagram("1a3", "1a +=")); // expected to print 0
    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2022-07-26 10:01:43

如果希望s1和s2包含非字母字符(如示例中所示),则需要更改以下几点:

  1. 你不应该从索引中减去a,因为例如对于数字这样的字符,这会给你一个负值。

  1. 您的最后一个循环不应该是0到25 (这意味着26个字母)。您应该遍历所有可能的字符,即遍历整个s1_count/s2_

数组。

  1. 您的s1_count和s2_count数组的大小应该足以容纳所有可能的有效字符,因此,如果您想要基本的ASCII集,则可以容纳128个字符,如果需要整个集合,则为256个.

顺便说一句,您不需要isupper()的支票。您只需对每个字符调用tolower()即可。如果它不是大写字母,它将返回未经修改的字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73121024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档