在C語言程式設計中,字符串操作是基礎且關鍵的技能。本文針對包含星號(*)的字符串(如"*****AB**C*D*****"),詳細講解如何處理前綴、後綴及中間的星號,提供完整的代碼實現與邏輯分析。
核心思路:統計字符串總長度與前綴星號個數,通過指針移動覆蓋實現刪除。
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
char chr[20], *b, *p;
int chr_num = 0, b_num = 0, i;
cout << "Please input a string:" << endl;
gets(chr);
// 統計字符串總長度
p = chr;
while(*p++) chr_num++;
// 統計前綴星號個數
b = chr;
while(*b++ == '*') b_num++;
// 刪除前綴星號
for(i = 0; i < chr_num - b_num; i++)
chr[i] = chr[i + b_num];
chr[i] = '\0';
cout << "The result:" << endl;
puts(chr);
return 0;
}
從字符串末尾向前掃描,統計後綴星號數量,直接截斷字符串。
// 統計後綴星號
t = chr + chr_num - 1;
while(*t-- == '*') t_num++;
// 刪除後綴星號
chr[chr_num - t_num] = '\0';
結合前兩種方法,先統計前綴與後綴星號數,再通過一次循環完成中間內容的前移。
for(i = 0; i < chr_num - b_num - t_num; i++)
chr[i] = chr[i + b_num];
chr[i] = '\0';
雙指針法:b指向首個非星號字符,t指向末尾非星號字符,中間遍歷複製非星號字符,最後拼接尾部星號。
// 定位有效內容區間
b = chr; while(*b++ == '*');
t = chr + chr_num - 1; while(*t-- == '*');
p = b;
while(b <= t) {
if(*b != '*') *p++ = *b;
b++;
}
// 複製尾部星號
++t;
while(*t) *p++ = *t++;
*p = '\0';
先刪除前綴,再在末尾補充相同數量的星號。
for(i = 0; i < chr_num - b_num; i++)
chr[i] = chr[i + b_num];
while(i < chr_num) chr[i++] = '*';
chr[i] = '\0';
從後向前移動有效內容,騰出空間放置後綴星號。
for(i = chr_num - t_num - 1; i >= 0; i--)
chr[i + t_num] = chr[i];
for(i = 0; i < t_num; i++)
chr[i] = '*';
若前綴星號超過n,保留n個,其餘刪除。
if(b_num > n) {
for(i = 0; i < chr_num - b_num; i++)
chr[i + n] = chr[i + b_num];
chr[i + n] = '\0';
}
同理,截斷多餘的後綴星號。
if(t_num > n)
chr[chr_num - t_num + n] = '\0';
gets()有緩衝區溢出風險,實際項目建議使用fgets()掌握這些基礎字符串操作模式,能顯著提升C語言底層開發能力,為嵌入式系統、系統編程等領域打下堅實基礎。