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

C 語言字符串刪除指定下標字符:多組數據處理實現

     編輯:關於C語言

題目描述

輸入 n 組數據,每組包含:

  1. 一行字符串(無空格)
  2. 一個整數 index(要刪除的字符下標,0-based)

輸出刪除指定下標字符後的字符串。

樣例


輸入:
2
ab*cdefg
5
ABCDEFG
3

輸出:
ab*cdfg
ABCEFG

解析:

  • 第1組:下標 5 是 e,刪除後 ab*cdfg
  • 第2組:下標 3 是 D,刪除後 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';         // 插入換行符混入數據,輸出邏輯混亂
// 統一輸出導致格式難控制

主要缺陷

  1. 數據結構不當:用 int[] 存字符,應用 char[]。
  2. 輸出耦合:所有結果存入單一大數組最後統一打印,難以控制每行格式。
  3. 無邊界檢查:下標越界時行為未定義。
  4. 變量名不可讀:i, i2, i3, j 缺乏語義。

算法複雜度

  • 時間:O(L) 每組,L 為字符串長度(單次遍歷移動)。
  • 空間:O(1) 額外空間(就地修改)。

進階:動態分配支持超長字符串


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)。

總結

  • 字符串刪除字符核心是後續字符前移覆蓋。
  • 逐組讀取、處理、輸出,邏輯清晰且內存恆定。
  • 務必做下標合法性檢查,避免緩衝區越界。
  • 變量命名要有語義,代碼可讀性是質量關鍵。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved