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

C语言不依赖额外字符串函数的子串存在性判断方法咨询

子串连续匹配实现方案

你需要的“先匹配首字符、再校验后续连续字符”的逻辑可以通过以下方式实现,相比原代码减少了无效的内层循环次数:

实现思路

  • 先获取主串、子串的长度,优先处理边界场景:子串长度为0默认匹配成功,主串长度小于子串直接匹配失败
  • 外层遍历主串,仅当主串当前字符与子串第一个字符相等时,才触发后续连续校验
  • 校验逻辑:从当前匹配到的首字符位置开始,逐位对比主串和子串的后续字符,若所有对应位置字符都相等则判定为连续匹配成功,直接终止遍历

代码实现

#include <stdio.h>

// 可选:自己实现strlen,无需引用string.h
int my_strlen(char *s) {
    int len = 0;
    while(s[len] != '\0') len++;
    return len;
}

int main()
{
    char str1[80] = "downtown", str2[20] = "town";
    int len1 = my_strlen(str1), len2 = my_strlen(str2);
    int i, j, matched = 0;

    // 边界处理
    if (len2 == 0) {
        printf("True");
        return 0;
    }
    if (len1 < len2) {
        printf("False");
        return 0;
    }

    // 外层仅找子串首字符匹配的位置
    for (i = 0; i <= len1 - len2; i++) {
        // 首字符不匹配直接跳过
        if (str1[i] != str2[0]) continue;
        // 首字符匹配,校验后续连续字符
        matched = 1;
        for (j = 1; j < len2; j++) {
            if (str1[i + j] != str2[j]) {
                matched = 0;
                break;
            }
        }
        if (matched) break;
    }

    printf(matched ? "True" : "False");
    return 0;
}

方案说明

该实现完全符合你要求的逻辑:先判断子串的首字符是否存在于主串中,仅在首字符匹配的场景下才校验后续字符的连续性,不会出现随机位置字符匹配就判定成功的问题。相比原代码,当子串首字符在主串中出现频率较低时,遍历效率会有明显提升。

内容的提问来源于stack exchange,提问作者EL02

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 05:00:03