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
相关产品推荐
相关产品推荐

