You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言大小写不敏感Anagram函数问题:转小写后功能失效

问题排查与修复方案

你的修改代码核心问题是临时数组转小写后未添加字符串终止符,导致后续遍历tempstr和tempstr2时会读取到内存中的垃圾数据,破坏判断逻辑。另外还有可优化的细节,下面分两种方式解决:

方案1:修复临时数组的写法

在转小写的循环结束后,手动给临时数组加上'\0',确保是合法的C字符串:

#include <ctype.h>
#include <string.h>

bool isAnagram(char* pattern, char* string) {
    char tempstr[100];
    char tempstr2[100]; 
    int count[256] = {0};
    int count2[256] = {0};
    int i;
    int len1 = strlen(pattern);
    int len2 = strlen(string);

    // 转小写并添加终止符
    for (i = 0; i < len1; i++) {
        tempstr[i] = tolower((unsigned char)pattern[i]);
    }
    tempstr[len1] = '\0'; // 关键:添加字符串终止符

    for (i = 0; i < len2; i++) {
        tempstr2[i] = tolower((unsigned char)string[i]);
    }
    tempstr2[len2] = '\0'; // 关键:添加字符串终止符

    // 先判断长度是否一致,不一致直接返回false
    if (len1 != len2) {
        return false;
    }

    // 统计字符出现次数
    for (i = 0; tempstr[i]; i++) {
        count[(unsigned char)tempstr[i]]++;
        count2[(unsigned char)tempstr2[i]]++;
    }

    for (i = 0; i < 256; i++) {
        if (count[i] != count2[i]) {
            return false;
        }
    }
    return true;
}
  • 提前计算字符串长度,避免多次调用strlen重复遍历
  • 转小写时把字符转成unsigned char,避免tolower处理负数值(比如某些扩展ASCII字符)
  • 先判断长度是否一致,不一致直接返回,减少不必要的计算

方案2:无需临时数组,直接计数时转小写

更简洁的写法,不用额外数组,直接在统计字符时转成小写:

#include <ctype.h>
#include <string.h>

bool isAnagram(char* pattern, char* string) {
    int count[256] = {0};
    int i;
    int len1 = strlen(pattern);
    int len2 = strlen(string);

    if (len1 != len2) {
        return false;
    }

    // 统计pattern的小写字符次数
    for (i = 0; i < len1; i++) {
        count[(unsigned char)tolower(pattern[i])]++;
    }

    // 用string的小写字符抵消计数
    for (i = 0; i < len2; i++) {
        count[(unsigned char)tolower(string[i])]--;
        // 提前判断,如果出现负数说明字符不匹配
        if (count[(unsigned char)tolower(string[i])] < 0) {
            return false;
        }
    }

    // 检查所有计数是否为0
    for (i = 0; i < 256; i++) {
        if (count[i] != 0) {
            return false;
        }
    }
    return true;
}
  • 只用一个计数数组,先统计第一个字符串的小写字符次数,再用第二个字符串的小写字符抵消
  • 中途如果出现计数为负,直接返回false,提前终止判断,效率更高

内容的提问来源于stack exchange,提问作者learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 22:13:08