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

C 語言字串處理:去除中間星號的指針操作深度解析

     編輯:程式設計綜合問答

經典 C 語言面試題:將字串 ******ab***cdf**rty******* 中間的 * 移除,保留首尾星號,結果為 ******abcdfrty*******。本文逐行解析指針操作邏輯,釐清 q、h、p、a[i] 的具體含義。

核心演算法邏輯

  1. 定位邊界:f 指向首個非星號字元,t 指向尾部最後一個非星號字元
  2. 三段式複製:
    • 前段 [a, f):完整複製(含前導星號)
    • 中段 [f, t]:跳過星號,只複製非星號字元
    • 尾段 (t, 末尾]:完整複製(含尾隨星號)
  3. 原地修改:直接在原陣列 a 上操作,最後補 \0

關鍵指針變量含義

變量含義初始化/移動
a原字串陣列(也是輸出緩衝區)主函數傳入 s
f首個非 * 字元位址while(*f=='*') f++;
t尾部最後一個非 * 字元位址while(*t) t++; t--; while(*t=='*') t--;
q遍歷游標初始 q=a,逐步後移
h中段起始邊界主函數傳入 f
p中段結束邊界主函數傳入 t
i寫入索引從 0 遞增

三段複製代碼逐行解析

第一段:複製前導星號區 [a, h)

char *q = a;  // q 指向字串開頭
int i = 0;
while (q < h) {          // 直到 q 達到第一個非星號字元
    a[i] = *q;           // 逐字元複製
    i++; q++;
}

效果:******ab***cdf**rty******* → 前 6 個 * + ab 被複製到 a[0..7],i=8,q 指向第一個中間 *。

第二段:過濾中間星號 [h, p]


while (q < p) {          // 遍歷中段
    if (*q != '*') {     // 非星號才複製
        a[i] = *q;
        i++;
    }
    q++;                 // q 無條件後移
}

效果:跳過所有中間 *,只保留 cdfrty,i 遞增至 14,q 指向尾部星號區起始。

第三段:複製尾部星號 (p, 末尾]


while (*q) {             // *q 非 '\0' 繼續
    a[i] = *q;
    i++; q++;
}
a[i] = '\0';             // 結束字串

關鍵點:q 當前指向尾部第一個 *,*q 為字元值而非位址。迴圈複製直到遇到 \0。

常見誤區釐清

  • Q: char *a 怎麼能用 a[i]?
    A: 在 C 中,陣列名/指標均可用下標存取。a[i] 等價 *(a+i)。
  • Q: while(*q) 何時結束?
    A: 當 q 指向字串結束符 \0,*q == 0 為假,迴圈結束。
  • Q: h、p 是怎麼傳進來的?
    A: 主函數用 f、t 計算好邊界後呼叫 fun(s, f, t),對應形參 a, h, p。

簡化版實現(教學用)


void remove_middle_stars(char *str) {
    char *left = str;
    while (*left == '*') left++;           // 首非星號
    char *right = str + strlen(str) - 1;
    while (right > left && *right == '*') right--; // 尾非星號
    
    char *read = left, *write = left;
    while (read <= right) {
        if (*read != '*') *write++ = *read; // 只寫非星號
        read++;
    }
    // 複製尾部星號
    while (*read) *write++ = *read++;
    *write = '\0';
}

總結

此題核心考察指針邊界計算與原地修改技巧。理解 f/t 如何框定「中間區域」,以及三段式複製的指針推進邏輯,即可掌握 C 字串處理的精髓。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved