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

C語言指針操作字符串:三種去除星號算法實現

     編輯:C 語言問答

字符串處理經典:指針實現三種去星號需求

題目需求

輸入字符串僅含字母和 *,編寫函數 fun(char *s) 分別實現:

  1. 刪除前導連續星號 (保留中間/尾部)。
  2. 刪除尾部連續星號 (保留前導/中間)。
  3. 刪除所有星號。

要求:使用指針與數組,原地修改。

核心思想:雙指針原地覆蓋

read 指針掃描源數據,write 指針寫入目標位置,最後補 \0。

完整實現

#include <stdio.h>
#include <string.h>

// 1. 刪除前導星號
void trim_leading_stars(char *s) {
    char *read = s;
    while (*read == '*') read++;  // 跳過前導 *
    char *write = s;
    while ((*write++ = *read++)); // 複製剩餘含結束符
}

// 2. 刪除尾部星號
void trim_trailing_stars(char *s) {
    char *end = s + strlen(s) - 1;
    while (end >= s && *end == '*') end--;  // 回溯找最後非*
    *(end + 1) = '\0';  // 截斷
}

// 3. 刪除所有星號
void remove_all_stars(char *s) {
    char *read = s, *write = s;
    while (*read) {
        if (*read != '*') *write++ = *read;
        read++;
    }
    *write = '\0';
}

// 測試主函數
void test(const char *label, char *s, void (*fun)(char*)) {
    printf("%s: [%s] -> ", label, s);
    fun(s);
    printf("[%s]\n", s);
}

int main() {
    char s1[] = "*****A*BC*DEF*G*****";
    char s2[] = "*****A*BC*DEF*G*****";
    char s3[] = "*****A*BC*DEF*G*****";
    test("刪除前導", s1, trim_leading_stars);   // [A*BC*DEF*G*****]
    test("刪除尾部", s2, trim_trailing_stars); // [*****A*BC*DEF*G]
    test("刪除所有", s3, remove_all_stars);    // [ABCDEFG]
    return 0;
}

指針技巧解析

函數關鍵指針操作時間/空間
trim_leadingread 先跑,write 從頭覆蓋O(n) / O(1)
trim_trailingstrlen 定位尾部,反向掃描截斷O(n) / O(1)
remove_all雙指針同步,read 篩選,write 緊湊O(n) / O(1)

進階:通用 trim 函數

void trim_chars(char *s, const char *chars, int leading, int trailing, int all) {
    // 可組合實現上述三種及任意字符集修剪
}

常見錯誤

  1. 忘記在末尾寫入 \0,導致字符串未正確結束。
  2. trim_trailing 中 end >= s 判斷順序錯誤,可能導致指針下溢。
  3. 用 strcpy/strcat 在同一緩衝區操作 → 行為未定義 (重疊內存)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved