字符串操作是 C/C++ 程式設計的基礎功夫,也是面試高頻考點。本文匯總五大實用場景:從字符串提取整數、用指針合併兩字符串、統計字母出現次數、刪除指定子串、替換子串。所有函數均採用指針操作,註釋詳盡,可直接用於項目或面試準備。
掃描字符串,將連續的數字字符轉為整數存入陣列,返回提取出的整數個數。例如 "af52d78d56dd89d" → [52, 78, 56, 89]。
tmp = tmp * 10 + (*src - '0') 直到非數字;int take_num(const char* src, int outArr[]) {
assert(src != NULL);
int count = 0, tmp = 0;
while (*src != '\0') {
tmp = 0;
if (*src >= '0' && *src <= '9') {
while (*src >= '0' && *src <= '9') {
tmp = tmp * 10 + *src - '0';
src++;
}
outArr[count++] = tmp;
} else {
src++;
}
}
return count;
}
將 str1 與 str2 拼接為新字符串並返回,必須動態分配內存,調用者負責釋放。
strlen(str1) + strlen(str2) + 1 字節;address 保存起始地址以便返回;'\0'。const char* mergeString(const char* str1, const char* str2) {
if (str1 == NULL) return str2;
if (str2 == NULL) return str1;
char* result = new char[strlen(str1) + strlen(str2) + 1];
char* address = result;
while (*str1 != '\0') *result++ = *str1++;
while (*str2 != '\0') *result++ = *str2++;
*result = '\0';
return address;
}
統計字符串中每個大寫字母(A-Z)出現的次數並打印。假設輸入僅含大寫字母。
void countString(const char* str) {
assert(str != NULL);
int a[52] = {0}; // 擴展至 52 兼容大小寫
while (*str != '\0') {
if (*str >= 'A' && *str <= 'Z') a[*str - 'A']++;
str++;
}
for (int i = 0; i < 26; i++) {
if (a[i] != 0) cout << char(i + 'A') << a[i];
}
}
從 src 中刪除所有 substring,結果存入 result,返回刪除次數。
tmp 截取當前位置長度為 strlen(substring) 的片段;strcmp 比對,匹配則跳過該長度,計數器遞增;result。int delete_substring(const char* src, const char* substring, char* result) {
assert(src != NULL && substring != NULL);
int count = 0, subLen = strlen(substring);
char* tmp = new char[subLen + 1];
char* pCpy = result;
while (*src != '\0') {
if (*src == *substring) {
strncpy(tmp, src, subLen);
tmp[subLen] = '\0';
if (strcmp(substring, tmp) == 0) {
count++;
src += subLen;
} else {
*pCpy++ = *src++;
}
} else {
*pCpy++ = *src++;
}
}
*pCpy = '\0';
delete[] tmp;
return count;
}
將 src 中所有 oldstr 替換為 newstr,返回新字符串(動態分配)。
len_src/len_old * len_new + 1;tmp 做匹配,匹配成功則拷貝 newstr 並跳過 oldstr 長度;fanhui。char* replaceString(char* src, const char* oldstr, const char* newstr) {
assert(src && oldstr && newstr);
int len_src = strlen(src), len_old = strlen(oldstr), len_new = strlen(newstr);
char* result = new char[len_new > len_old ? len_src / len_old * len_new + 1 : len_src];
char* fanhui = result;
char* tmp = new char[len_old + 1];
char* markNew;
while (*src != '\0') {
if (*src == *oldstr) {
strncpy(tmp, src, len_old);
tmp[len_old] = '\0';
if (strcmp(tmp, oldstr) == 0) {
markNew = (char*)newstr;
while (*markNew != '\0') *result++ = *markNew++;
src += len_old;
} else {
*result++ = *src++;
}
} else {
*result++ = *src++;
}
}
*result = '\0';
delete[] tmp;
return fanhui;
}
int main() {
// 測試刪除子串
char* str1 = "abcdabac";
char* str2 = "ab";
char* result = new char[strlen(str1) + 1];
delete_substring(str1, str2, result);
cout << "刪除後: " << result << endl;
delete[] result;
// 測試提取數字
char* strin = "af52d78d56dd89d";
int* outArray = new int[strlen(strin)];
take_num(strin, outArray);
// 測試替換子串
char* srcstr = "22abcdabokabhaha";
char* newstr = "xyz";
char* oldstr = "ab";
char* replaced = replaceString(srcstr, oldstr, newstr);
cout << "替換後: " << replaced << endl;
delete[] replaced;
// 測試合併字符串
// char* s1 = "nihao";
// char* s2 = "xyz";
// char* merged = mergeString(s1, s2);
// cout << merged << endl;
// delete[] merged;
// 測試字母統計
char* str = "aaabbbbDDdjingianigndai";
countString(str);
return 0;
}
本文五個函數展示了 C 風格字符串的指針操作精髓:動態內存管理、雙指針遍歷、臨時緩衝區匹配、返回地址保存。實戰中注意:
new 必須配對 delete[];'\0' 正確處理。掌握這些模式,字符串處理不再是痛點。