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

C语言中使用ASCII码实现字符串转大写及报错问题排查

问题分析与修复

你的代码里存在几个关键错误,直接导致了运行时权限报错,下面逐一拆解并修复:

  • 条件判断逻辑完全错误
    你写的if (str[index] < 97 && str[index] < 122)逻辑彻底反转了:小写字母的ASCII范围是97(a)到122(z),正确判断应该是str[index] >= 97 && str[index] <= 122,你的写法等于没筛选任何小写字母,还会把非小写字母的字符错误纳入判断。

  • 减法操作的致命错误
    str[index] = str[index] - str[32];是核心问题:str[32]是访问字符串数组的第33个元素(下标从0开始),如果输入字符串长度不足33,会直接触发数组越界访问;更严重的是,若你传入的是字符串字面量(比如ft_strupcase("hello")),这类字面量存在程序的只读内存段,越界或修改操作都会触发你看到的Bad permissions错误。正确写法是直接减去数值32,即str[index] -= 32;。

  • 额外注意:字符串字面量的只读属性
    即便修正了上面的错误,若调用时传入字符串字面量(比如char *s = "test"; ft_strupcase(s);),依然会报错——因为字符串字面量是只读的,无法修改。必须传入可修改的字符数组,比如char s[] = "test"; ft_strupcase(s);。

修正后的代码

char    *ft_strupcase(char *str)
{
    int index;
    index = 0;
    while (str[index] != '\0')
    {
        // 正确匹配小写字母的ASCII范围
        if (str[index] >= 97 && str[index] <= 122)
        {
            // 直接减去ASCII差值32
            str[index] -= 32;
        }
        ++index;
    }
    return str;
}

安全调用示例

#include <stdio.h>

int main()
{
    // 使用可修改的字符数组,而非只读字符串字面量
    char str[] = "Hello World!";
    printf("转换前: %s\n", str);
    printf("转换后: %s\n", ft_strupcase(str));
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:01:11