Jaden字符串大小写转换代码触发SIGSEGV错误,请求问题排查
代码问题分析及修复方案
你的代码能完成大部分单词首字母大写的功能,但触发SIGSEGV(无效内存访问)的原因主要有以下几点:
- 未处理
string为NULL的情况:当测试用例传入空指针作为string参数时,代码第一行直接解引用NULL指针,这属于C语言未定义行为,会直接触发内存访问错误。 - 未检查
jaden_case是否为NULL:如果调用者传入的jaden_case是空指针,写入该指针指向的内存同样会导致无效内存访问。 - 潜在的内存越界风险:若
string长度超过jaden_case的分配空间,写入jaden_case + i时会越界访问内存,也可能触发SIGSEGV。
修复后的代码
#include <string.h> char *to_jaden_case(char *jaden_case, const char *string) { // 检查空指针 if (jaden_case == NULL || string == NULL) { return jaden_case; } size_t len = strlen(string); // 处理空字符串 if (len == 0) { jaden_case[0] = '\0'; return jaden_case; } // 处理第一个字符 if (string[0] >= 'a' && string[0] <= 'z') { jaden_case[0] = string[0] - 32; } else { jaden_case[0] = string[0]; } // 处理后续字符 for (size_t i = 1; i < len; i++) { if (string[i-1] == ' ' && string[i] >= 'a' && string[i] <= 'z') { jaden_case[i] = string[i] - 32; } else { jaden_case[i] = string[i]; } } // 添加字符串结束符 jaden_case[len] = '\0'; return jaden_case; }
修复说明
- 增加空指针检查,避免解引用空指针导致崩溃。
- 使用
strlen获取字符串长度,逻辑更清晰,同时处理了空字符串场景。 - 改用
size_t作为循环变量,避免int类型处理超长字符串时的溢出问题。 - 统一字符判断逻辑,提升代码可读性。
内容的提问来源于stack exchange,提问作者benno vasconcellos
相关产品推荐
相关产品推荐

