《Pointers On C》习题6.18-2删除子串代码运行失败求排查
问题排查与修复
核心错误点
- 内存访问权限错误(直接导致崩溃)
main函数中定义的char *source = "hello, people."指向的是字符串字面量,C标准规定字符串字面量存储在只读内存段,尝试修改会触发段错误,是运行崩溃的直接原因。 - 子串匹配逻辑错误
del_substr函数的内层匹配循环存在漏洞:每次字符比较无论是否相等,offset和suboffset都会自增,匹配失败后又额外执行了offset++,会导致原串字符被跳过,出现漏匹配问题。 - 拷贝逻辑偏移计算错误
匹配成功后的字符串前移逻辑偏移量计算错误,会导致拷贝后的字符串出现乱码、多删或少删的问题。
注:原代码中的find_char函数未被调用,不需要可以直接删除。
修复后的完整代码
#include <stdio.h> int del_substr(char *str, char const *substr) { int offset = 0; int suboffset = 0; int match_start = 0; // 记录子串匹配的起始位置 if (str == NULL || substr == NULL || *substr == '\0') return 0; while(*(str + offset) != '\0') { match_start = offset; suboffset = 0; // 修正匹配逻辑:只有字符相等时才同时移动两个指针 while(*(str + offset) != '\0' && *(substr + suboffset) != '\0' && *(str + offset) == *(substr + suboffset)) { offset++; suboffset++; } // 完全匹配到子串 if(*(substr + suboffset) == '\0') { // 从匹配起始位置开始,将后续字符前移覆盖子串 char *dst = str + match_start; char *src = str + offset; while ((*dst++ = *src++) != '\0'); return 1; } // 匹配失败,回到本次匹配起始位置的下一个字符重新尝试 offset = match_start + 1; } return 0; } int main() { // 改为字符数组,存储在栈上支持修改 char source[] = "hello, people."; char *chars = "peo"; del_substr(source, chars); printf("result:%s\n", source); // 输出结果:result:hello, ple. return 0; }
内容的提问来源于stack exchange,提问作者badii
相关产品推荐
相关产品推荐

