You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:15:03