首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言統計字符串中子串出現次數:strstr 循環查找實現

     編輯:關於C語言

字符串子串計數:基於 strstr 的高效實現

利用標準庫 strstr 循環查找,配合指標移動實現子串出現次數統計。核心思路:每次找到匹配後,從匹配位置下一字符繼續搜尋,避免重複計數。

完整代碼實現

#include 
#include 

// 函數聲明
int count_substring(const char *haystack, const char *needle);

int main(void) {
    char str[64] = {0};
    char substr[16] = {0};

    printf("請輸入主字符串: ");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0';  // 移除換行符

    printf("請輸入子串: ");
    fgets(substr, sizeof(substr), stdin);
    substr[strcspn(substr, "\n")] = '\0';

    printf("主串長度: %zu\n", strlen(str));
    printf("子串長度: %zu\n", strlen(substr));

    int count = count_substring(str, substr);
    printf("子串出現次數: %d\n", count);
    return 0;
}

// 統計子串出現次數(非重疊)
int count_substring(const char *haystack, const char *needle) {
    if (!haystack || !needle || !*needle) return 0;

    int count = 0;
    const char *p = haystack;

    while ((p = strstr(p, needle)) != NULL) {
        count++;
        p++;  // 移動到匹配位置的下一字符,繼續搜尋
    }
    return count;
}

關鍵邏輯解析

  1. strstr(p, needle) 在 p 起始位置查找 needle
  2. 找到返回匹配位置指標,未找到返回 NULL
  3. 關鍵步驟:p++ 使下輪搜尋從匹配字符後一位開始,實現非重疊計數
  4. 若需重疊計數(如 "aaa" 中 "aa" 出現 2 次),改為 p += 1 即可(同上),但需確認業務需求

安全性改進說明

  • 使用 fgets 替代危險的 gets,防止緩衝區溢出
  • 手動移除 fgets 保留的換行符
  • 入參檢查:空指標、空子串直接返回 0
  • 使用 const 修飾輸入指標,語義明確

複雜度與替代方案

指標strstr 循環法KMP 演算法
時間複雜度O(n×m) 最壞O(n+m)
空間複雜度O(1)O(m)
實現難度簡單中等
適用場景短文本、原型開發長文本、高頻調用

對於一般應用,strstr 循環法代碼簡潔、可讀性強、標準庫優化良好,足夠應對多數場景。

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