C语言自定义string_deletion函数调用触发运行错误的原因问询
问题原因及修复方案
核心崩溃原因
1. string_deletion函数存在未定义行为
你写的赋值语句*(index-m)=*(index++);违反了C语言的序列点规则:同一条表达式中,对index既进行取值运算(计算index-m和读取*index),又进行自增修改,且两者没有明确的执行顺序,不同编译器处理逻辑不同,大概率会导致指针计算错误、内存访问异常。
2. string_search的循环终止条件存在越界风险
你在循环中调用删除函数修改了原字符串的长度,但循环逻辑未适配长度变化:子串删除后字符串整体长度变短,原有的边界判断会失效,m指针持续递增后会超出main_string数组的100字节边界,访问非法内存触发崩溃。
另外如果要删除的子串长度大于原字符串长度,string_len(s)-string_len(d)会得到负数,转为无符号地址后是极大值,循环会直接越界。
修复代码
1. 修复string_deletion的未定义行为
把自增操作拆分到单独的语句,明确执行顺序:
void string_deletion(char *s, int m) { char *index = s + m; while(*index != 0) { *(index - m) = *index; index++; } *(index - m) = 0; }
2. 修复string_search的循环逻辑
每次匹配到子串删除后,不需要递增m指针(因为后面的字符已经左移,当前m位置已经是新的字符,需要重新判断),同时先做长度校验,动态更新原字符串长度:
void string_search(char *s,char *d) { int len_d = string_len(d); int len_s = string_len(s); // 子串长度不合法直接返回 if (len_d == 0 || len_s < len_d) return; char *m = s; char word_buffer[20]; // 循环条件改为不超过最大可匹配起始位置 while(m <= s + len_s - len_d) { if(*m == *d) { int i = 0; char *r = m; char *buffer_index = word_buffer; while(i < len_d && *r != 0) { *(buffer_index++) = *(r++); i++; } *buffer_index = 0; if(string_comp(word_buffer, d) == 0) { printf("\nInvoking deletion sequence\n"); string_deletion(m, len_d); // 删除后更新原字符串长度,跳过m递增,当前位置需要重新匹配 len_s = string_len(s); continue; } } m++; } }
其他可优化点
word_enter函数需要增加输入长度校验,避免输入内容超过数组容量导致缓冲区溢出- 可以直接用标准库的
strlen、strcmp、strstr函数替代自主实现的对应功能,减少手写代码出错概率
内容的提问来源于stack exchange,提问作者LordObnoxious
相关产品推荐
相关产品推荐

