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
相关产品推荐
相关产品推荐

