C语言实现Detect Pangram功能运行报SIGSEGV(11)错误求助
错误原因
- 核心触发SIGSEGV的原因:你直接修改了输入字符串
str的内容。Codewars的测试用例传入的str是只读字符串常量,存储在内存的只读数据段,对该区域执行写入操作会直接触发段错误(SIGSEGV)。你代码中遍历字符串将大写字母转小写时直接修改str[i],属于非法写入操作。 - 次要逻辑错误:你的
alphabet数组是局部栈变量,未初始化就直接使用,数组内初始值是随机垃圾值,导致判断字母是否已存在的逻辑完全失效,虽然这个不会直接触发段错误,但会导致判断结果错误。另外你给alphabet数组清零的操作放在了使用数组之后,执行顺序完全颠倒。
修复后的代码
#include <ctype.h> int is_pangram(const char *str) { // 初始化标记数组,0表示对应字母未出现,1表示已出现 int alphabet[26] = {0}; int appear_count = 0; while (*str != '\0') { // 临时转小写,不修改原字符串 char lower_char = tolower((unsigned char)*str); if (lower_char >= 'a' && lower_char <= 'z') { int idx = lower_char - 'a'; if (alphabet[idx] == 0) { alphabet[idx] = 1; appear_count++; // 提前终止:已经凑齐所有字母直接返回 if (appear_count == 26) { return 1; } } } str++; } return appear_count == 26; }
关键修改说明
- 输入参数增加
const修饰,明确输入是只读属性,从语法层面避免误改原字符串 - 取消修改原字符串的逻辑,判断时单独将字符转小写存入临时变量,不触碰原串内存
- 初始化
alphabet数组为全0,用0/1标记对应字母是否出现,逻辑更清晰 - 新增提前退出逻辑,凑齐26个字母后直接返回,不需要遍历完整个字符串,执行效率更高
- 删除原代码中冗余的字符串长度计算、数组后置清零等无用逻辑,代码更精简
内容的提问来源于stack exchange,提问作者YCH
相关产品推荐
相关产品推荐

