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

C 語言經典面試題:實現統計子串出現次數函數 fun(char *s1, char *s2) 的完整代碼與邊界測試

     編輯:程式設計疑難解答

題目要求

實現 int fun(char *s1, char *s2),統計 s2 在 s1 中非重疊出現次數,main 函數處理輸入輸出,無匹配輸出 No find。

完整代碼

#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 a[80], b[80];
    int n;
    printf("Please input the first string: ");
    gets(a); // 注意:gets 不安全,教學用;實際用 fgets
    printf("Please input the second string: ");
    gets(b);
    n = fun(a, b);
    if (n == 0) printf("No find\n");
    else printf("n=%d\n", n);
    return 0;
}

測試用例

輸入:
abaaAabcaabbabca
ab
輸出: n=4

輸入:
abaaAabcaabbabca
abd
輸出: No find

邊界情況

  • s2 為空串:len2=0,外層循環條件 i <= len1 可能導致無限循環,建議開頭判斷 if (len2 == 0) return 0;。
  • s1 為空串:len1=0,外層不進入,返回 0。
  • 超長字符串:gets 易溢出,生產環境必須用 fgets。

複雜度

時間 O(n×m),空間 O(1)。n=主串長,m=子串長。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved