利用標準庫 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; }
strstr(p, needle) 在 p 起始位置查找 needleNULLp++ 使下輪搜尋從匹配字符後一位開始,實現非重疊計數p += 1 即可(同上),但需確認業務需求fgets 替代危險的 gets,防止緩衝區溢出fgets 保留的換行符const 修飾輸入指標,語義明確| 指標 | strstr 循環法 | KMP 演算法 |
|---|---|---|
| 時間複雜度 | O(n×m) 最壞 | O(n+m) |
| 空間複雜度 | O(1) | O(m) |
| 實現難度 | 簡單 | 中等 |
| 適用場景 | 短文本、原型開發 | 長文本、高頻調用 |
對於一般應用,strstr 循環法代碼簡潔、可讀性強、標準庫優化良好,足夠應對多數場景。