C语言手动实现strstr功能时预期返回false却返回true是什么原因?
问题原因
- 字符串长度判断错误,所有
strlen()计算后都额外减了1,直接导致永远不会比较字符串的最后一个字符。你测试用的模式串是"sh",strlen("sh")返回值为2,内层循环条件j < strlen(ch2) - 1等价于j < 1,也就是说只会比较模式串的第0位字符:当ch1[i]匹配到s后,j自增到1,直接退出内层循环,函数立刻返回1,根本不会比较模式串第1位的h,所以得到错误的true结果。 - 匹配失败时的指针回退逻辑错误。仅重置了模式串指针
j,主串指针i没有回退到本次匹配起始位置的下一位,会导致部分匹配场景下漏检正确的匹配位置,比如主串"aabbaabb"、模式串"ab"时就会出现匹配错误。 - 边界情况未处理,比如模式串为空、主串长度小于模式串长度的场景,代码没有做前置判断,可能出现越界访问或者错误返回。
- 循环结构逻辑错误,内层循环结束后直接
return 1,不会继续检查主串后续的字符,只要前面有部分长度匹配就会直接返回正确,完全不符合匹配逻辑。
修正后的代码
#include <stdio.h> #include <string.h> int searchStr(char *ch1, char *ch2) { int len1 = strlen(ch1); int len2 = strlen(ch2); // 前置处理边界情况,和标准库strstr行为一致 if (len2 == 0) return 1; if (len1 < len2) return 0; for (int i = 0; i <= len1 - len2; i++) { int j; for (j = 0; j < len2; j++) { if (ch1[i + j] != ch2[j]) { break; } } // 模式串所有字符都匹配成功 if (j == len2) { return 1; } } return 0; } int main() { printf("%d", searchStr("science", "sh")); // 输出0,符合预期 return 0; }
内容的提问来源于stack exchange,提问作者Yacine TAZDAIT
相关产品推荐
相关产品推荐

