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

实现字符串转大写函数触发Segmentation fault,求错误原因

字符串转大写函数触发段错误的原因及修复

错误根源

你代码里的for循环条件*str != '\0'存在致命问题:str是函数接收的原指针,在整个循环过程中从未移动过,只要传入的初始字符串非空,这个条件就永远为真,导致i持续递增,不断访问str[i]超出字符串的内存边界,最终触发段错误(Segmentation Fault)。

修复方案

有两种常见的修正方式:

方式1:基于索引遍历(修正原逻辑)

把循环条件改为判断当前索引位置的字符是否为字符串结束符'\0':

char *string_toupper(char *str)
{
    int i;

    // 循环条件改为检查当前索引的字符是否为'\0'
    for (i = 0; str[i] != '\0'; i++)
    {
        if (str[i] >= 'a' && str[i] <= 'z')
            str[i] -= 32;
    }
    return (str);
}

方式2:基于指针遍历(更简洁的写法)

直接移动指针遍历字符串,避免使用索引变量:

char *string_toupper(char *str)
{
    char *ptr = str; // 用临时指针保存原地址,避免修改返回值的指针

    while (*ptr != '\0')
    {
        if (*ptr >= 'a' && *ptr <= 'z')
            *ptr -= 32;
        ptr++; // 移动指针到下一个字符
    }
    return (str);
}

测试结果

修正后运行测试代码,会输出:

HELLO WORLD!

HELLO WORLD!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:33:20