首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言指針算術實現子串查找:strstr 邏輯手寫版深度解析

     編輯:程式設計疑難解答

代碼對比

與上一題基本一致,區別在於參數類型修正為 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;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved