本文匯總5道高頻字符串操作面試題,涵蓋字符查找、子串判斷、出現次數統計、字符串反轉、連續字符壓縮,附帶標準庫函數與手寫實現兩種思路。
需求:輸入字符串與目標字符,輸出該字符所有位置(1-based索引)。
// 輸入: asdfwd / d → 輸出: 3, 6 // 輸入: hhff / h → 輸出: 1, 2
標準庫實現(strchr):
#include <string.h>
int main() {
char a[100] = "sgfgeasdefw";
char target; scanf("%c", &target);
char *p = a;
while ((p = strchr(p, target))) {
printf("%ld\n", p - a + 1); // 指針差得索引
p++; // 移至下一字符繼續查找
}
return 0;
}
需求:字符串2在字符串1中存在輸出Y,否則N。
// 輸入: asdfwd / dfw → Y // 輸入: sgfgeasdfw / hhff → N
實現(strstr):
char a[100] = "sgfgeasdfw";
const char *b = "ge";
if (strstr(a, b)) printf("Y"); else printf("N");
需求:輸出字符串2在字符串1中出現的次數。
// 輸入: asdfwd / d → 2 // 輸入: hhff / h → 2
實現(strstr循環):
char *src = "asfdasdfassdf";
char target[100]; scanf("%s", target);
int cnt = 0; char *p = src;
while ((p = strstr(p, target))) { cnt++; p++; }
printf("出現次數: %d", cnt);
需求:輸入asdfwd,輸出dwfdsa。
實現(臨時數組法):
char *reverse(char *a) {
int len = strlen(a);
char b[100] = {0};
for (int i = len-1; i >= 0; i--)
b[len-i-1] = a[i];
return b;
}
// 注意:返回局部數組指針有風險,工程中應動態分配或傳出參數
需求:eeeeeaaaff → e5a3f2。單字符不加計數(避免長度增長)。
原地壓縮實現:
void condense(char *src_str) {
if (!src_str) return;
int count = 1, sub_len = 1;
for (int i = 1; i < strlen(src_str); i++) {
if (src_str[i] == src_str[i-1]) count++;
else {
if (count == 1) src_str[sub_len++] = src_str[i]; // 單字符只複製
else {
src_str[sub_len++] = count + '0'; // 計數轉ASCII
src_str[sub_len++] = src_str[i];
count = 1;
}
}
}
if (sub_len < strlen(src_str)) src_str[sub_len] = '\0';
printf("%s\n", src_str);
}
需求:子函數實現壓縮,指針返回結果字符串。
char *getStringToCompress(char *src) {
char compress[100] = {}; // 局部靜態或動態分配更安全
int cnt = 0, i = 0;
char al[100] = {}; int num[100] = {0};
char *psrc = src;
// 統計連續字符
while (*psrc) {
cnt++;
if (*psrc != *(psrc+1)) {
num[i] = cnt; al[i] = *psrc; cnt = 0; i++;
}
psrc++;
}
// 構建結果字符串
char buf[100] = "";
for (int h = 0; h < strlen(al); h++) {
if (isalpha(al[h])) { sprintf(buf, "%c", al[h]); strcat(compress, buf); }
if (!isalpha(num[h])) { sprintf(buf, "%d", num[h]); strcat(compress, buf); }
}
return compress; // 警告:返回局部數組指針未定義行為
}
改進建議:函數參數傳出緩衝區void compress(char *src, char *dst, int dst_size),避免返回棧內存指針。
string.h標準庫(strchr、strstr、strlen)簡化代碼p - a求索引、p++移動)是C語言字符串處理核心技巧