实现字符串转大写函数触发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
相关产品推荐
相关产品推荐

