自行实现的ft_strstr函数自测正常但系统测评失败,求问题定位
ft_strstr函数问题排查
问题根因
你的代码核心问题是内层匹配循环中直接修改了外层遍历的下标i,匹配失败后没有将i回退到本次匹配起始位置的下一位,会跳过部分可能的匹配场景,导致出现错判。
举个简单的复现例子:
- str =
"aaab",to_find ="aab" - 第一轮匹配从i=0开始,匹配到i=2、k=2时匹配失败,此时i已经被累加为2,外层循环又执行i++变成3,直接跳过了本应正确的匹配起始位置i=1,就会出现不符合预期的返回结果。
你测评返回的错误就是因为类似的场景:本不存在匹配(应返回-1),你的代码错误识别到了不存在的匹配,返回了偏移量7、87,和标准库结果不一致。
修复方案
推荐新增临时变量存储匹配过程的偏移,避免直接修改外层遍历的下标i,逻辑更清晰也不容易出错:
char *ft_strstr(char *str, char *to_find) { int i; int j; int k; i = 0; if (*to_find == 0) return (str); while (str[i] != '\0') { j = i; k = 0; while (str[j] && to_find[k] && str[j] == to_find[k]) { j++; k++; if (to_find[k] == '\0') return (&str[i]); } i++; } return (0); }
如果你要保留原有写法,只需要在内层匹配失败后回退i的值,删除原有多余的i++即可:
// 原有内层while循环结束后修改为 i = i - k + 1; k = 0;
内容的提问来源于stack exchange,提问作者Toyama70
相关产品推荐
相关产品推荐

