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

CS50x Leet转换程序中strlen()触发段错误的修复方法

问题分析与解决

核心错误原因

你遇到的段错误(segmentation error)根本原因不是字符串缺少NUL终止符,而是传入strlen()的是一个空指针:

  • 命令行参数的索引规则是:argv[0]是程序本身的名称,用户输入的第一个参数是argv[1]
  • 你的代码里调用replace(argv[2]),但当用户按提示输入./no-vowels word时,argc的值是2,argv[2]并不存在,是一个空指针(NULL)
  • strlen()无法处理空指针,直接访问会触发内存访问错误,也就是段错误

代码修正方案

只需要把main函数里的argv[2]改成argv[1],同时优化参数检查的条件(确保用户恰好传入一个参数):

string replace(string word);

int main(int argc, string argv[])
{
    if (argc != 2) 
    {
        printf("Usage: ./no-vowels word\n");
        return 1; // 退出程序并返回错误码
    }
    else
    {
        printf("%s", replace(argv[1]));
    }
    return 0;
}

string replace(string word)
{
    int n = strlen(word);
    char vowel[4] = {'A', 'E', 'I', 'O'};

    // 遍历字符串每个字符的逻辑
    for (int i = 0; i < n; i++)
    {
      // 你的替换代码
    }
    return word;
}

额外说明

  • CS50的string类型本质是char*,命令行传入的参数本身是自动带NUL终止符的,不需要手动添加
  • 当argc < 2时,原来的代码没有退出程序,会继续执行后续逻辑,现在加上return 1可以避免这种无效执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 14:47:07