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
相关产品推荐
相关产品推荐

