輸入 n 組數據,每組包含:
index(要刪除的字符下標,0-based)輸出刪除指定下標字符後的字符串。
輸入:
2
ab*cdefg
5
ABCDEFG
3
輸出:
ab*cdfg
ABCEFG
解析:
e,刪除後 ab*cdfgD,刪除後 ABCEFG
#include
#include
#define MAX_LEN 1000
#define MAX_CASES 100
int main() {
int n;
if (scanf("%d", &n) != 1 || n <= 0 || n > MAX_CASES) return 1;
for (int caseIdx = 0; caseIdx < n; caseIdx++) {
char str[MAX_LEN];
int delIdx;
// 讀取字符串(無空格,%s 足夠)
if (scanf("%s", str) != 1) break;
// 讀取下標
if (scanf("%d", &delIdx) != 1) break;
int len = strlen(str);
// 邊界檢查
if (delIdx < 0 || delIdx >= len) {
printf("%s\n", str); // 下標非法,原樣輸出
continue;
}
// 就地移除:將 delIdx 後字符前移
for (int i = delIdx; i < len - 1; i++) {
str[i] = str[i + 1];
}
str[len - 1] = '\0'; // 新結束符
printf("%s\n", str);
}
return 0;
}
// 原始版本存在的問題:
int b[1000]; // 用 int 數組存字符,浪費空間且類型不匹配
b[i3] = a[i2]; // 隱式轉換 char→int,輸出時 %c 強制解釋
b[i3] = '\n'; // 插入換行符混入數據,輸出邏輯混亂
// 統一輸出導致格式難控制
int[] 存字符,應用 char[]。i, i2, i3, j 缺乏語義。
char *str = NULL;
size_t cap = 0;
ssize_t len = getline(&str, &cap, stdin); // POSIX,含換行
if (len > 0 && str[len-1] == '\n') str[--len] = '\0';
// ... 處理 ...
free(str);
適合不知道最大長度的場景(需 #define _GNU_SOURCE)。