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

C語言字符串經典練習:查找、比較、統計、反轉、壓縮

     編輯:關於C語言

C語言字符串經典練習:查找、比較、統計、反轉、壓縮

本文匯總5道高頻字符串操作面試題,涵蓋字符查找、子串判斷、出現次數統計、字符串反轉、連續字符壓縮,附帶標準庫函數與手寫實現兩種思路。

練習1:查找字符所有出現位置

需求:輸入字符串與目標字符,輸出該字符所有位置(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:判斷子串是否存在

需求:字符串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");

練習3:統計子串出現次數

需求:輸出字符串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);

練習4:字符串反轉

需求:輸入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;
}
// 注意:返回局部數組指針有風險,工程中應動態分配或傳出參數

練習5:連續字符壓縮編碼

需求: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);
}

練習6:壓縮編碼函數版(指針返回)

需求:子函數實現壓縮,指針返回結果字符串。

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語言字符串處理核心技巧
  • 原地修改需注意緩衝區溢出與結束符處理
  • 函數設計避免返回局部數組指針,傳出參數更安全
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved