與上一題基本一致,區別在於參數類型修正為 char *s1, char *s2,且使用指針算術 *(s1+i+j) 而非下標 s1[i+j]。
s1 是指向主串首字符的指針。s1 + i 指向第 i 個字符(窗口起始)。s1 + i + j 指向窗口內第 j 個字符。*(s1 + i + j) 解引用獲取字符值。s1[i+j],但更貼近底層內存操作語義。i += j - 1// 例:主串 "12312" 找 "12"
// i=0: 匹配 "12" 成功,j=2
// i += 2-1 = 1 → 外層 i++ 變 2
// 下一輪直接從索引 2 開始比較 "312",跳過 "23" 無效比較
若不跳過,i=1 會比較 "23",i=2 比較 "31",多次無效比較。
使用 i += len2 - 1 更清晰,因匹配成功時 j == len2。
#include
#include
int fun(char *s1, char *s2) {
int i, j, len1 = strlen(s1), len2 = strlen(s2), n = 0;
for (i = 0; i <= len1 - len2; i++) {
for (j = 0; j < len2; j++) {
if (*(s1 + i + j) != *(s2 + j)) break;
}
if (j == len2) {
i += j - 1;
n++;
}
}
return n;
}
int main() {
char s1[100], s2[100];
printf("主串: "); gets(s1);
printf("子串: "); gets(s2);
int n = fun(s1, s2);
if (n == 0) printf("No find\n");
else printf("n=%d\n", n);
return 0;
}