輸入字符串僅含字母和 *,編寫函數 fun(char *s) 分別實現:
要求:使用指針與數組,原地修改。
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_leading | read 先跑,write 從頭覆蓋 | O(n) / O(1) |
| trim_trailing | strlen 定位尾部,反向掃描截斷 | O(n) / O(1) |
| remove_all | 雙指針同步,read 篩選,write 緊湊 | O(n) / O(1) |
void trim_chars(char *s, const char *chars, int leading, int trailing, int all) {
// 可組合實現上述三種及任意字符集修剪
}
\0,導致字符串未正確結束。trim_trailing 中 end >= s 判斷順序錯誤,可能導致指針下溢。strcpy/strcat 在同一緩衝區操作 → 行為未定義 (重疊內存)。