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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:24:00