在字符串處理中,統計特定字符或子字符串出現次數是常見需求。本文提供一個基於 C 風格字符串的查找函數實現,並分析其邏輯與潛在問題。
int count1(char* str, char* s) {
char* s1;
char* s2;
int count = 0;
while (*str != '\0') {
s1 = str;
s2 = s;
while (*s2 == *s1 && (*s2 != '\0') && (*s1 != '0')) {
s2++;
s1++;
}
if (*s2 == '\0')
count++;
str++;
}
return count;
}
str 的每個起始位置str 從當前位置開始的子串與目標字符串 s*s2 == '\0' 結束,表示完整匹配,計數器加一*s1 != '0' 可疑:應為 *s1 != '\0' (空字符),否則遇到字符 '0' 會誤判斷s 為空字符串,會導致無限迴圈或未定義行為const char*int countSubstring(const char* str, const char* substr) {
if (!str || !substr || *substr == '\0') return 0;
int count = 0;
const char* p = str;
while (*p) {
const char* s1 = p;
const char* s2 = substr;
while (*s2 && *s1 == *s2) {
++s1; ++s2;
}
if (*s2 == '\0') ++count;
++p;
}
return count;
}
std::string 與 std::search
#include <string>
#include <algorithm>
int countSubstring(const std::string& str, const std::string& substr) {
if (substr.empty()) return 0;
int count = 0;
auto it = str.begin();
while ((it = std::search(it, str.end(), substr.begin(), substr.end())) != str.end()) {
++count;
++it; // 允許重疊匹配;若不允許改為 it += substr.length()
}
return count;
}
string::find (不重疊)
int countSubstringNoOverlap(const std::string& str, const std::string& substr) {
if (substr.empty()) return 0;
int count = 0;
std::size_t pos = 0;
while ((pos = str.find(substr, pos)) != std::string::npos) {
++count;
pos += substr.length();
}
return count;
}
原始函數展示了基礎指標操作邏輯,但存在邊界條件缺陷。實務開發建議使用 std::string 配合標準演算法,更安全、可讀且易維護。