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

C 語言動態數組:以特定字符結束輸入的 realloc 實現

     編輯:程式設計綜合問答

需求

輸入不定長字符串,遇到特定字符(如 '0')結束,自動擴容存儲。

完整代碼

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char *buf = NULL, *tmp = NULL;
    int capacity = 100, len = 0;
    int ch;

    buf = malloc(capacity);
    if (!buf) return 1;

    while ((ch = getchar()) != '0' && ch != EOF) {
        if (len + 1 >= capacity) {  // +1 留給結束符
            capacity *= 2;
            tmp = realloc(buf, capacity);
            if (!tmp) { free(buf); return 1; }
            buf = tmp;
        }
        buf[len++] = (char)ch;
    }
    buf[len] = '\0';

    printf("輸入內容: %s\n", buf);
    printf("長度: %d, 容量: %d\n", len, capacity);

    free(buf);
    return 0;
}

關鍵點

  • 倍增策略:capacity *= 2 均攤 O(1) 擴容成本。
  • realloc 失敗保護:用臨時指針 tmp 接收,失敗時原指針仍有效,避免內存洩漏。
  • 結束條件:同時判斷哨兵字符 '0' 和 EOF (Ctrl+D/Z)。
  • 留位給 \0:len + 1 >= capacity 確保字符串結束符空間。

進階封裝:動態字符串結構體

typedef struct {
    char *data;
    size_t len, cap;
} DynStr;

void dynstr_init(DynStr *s) { s->data = malloc(64); s->len = 0; s->cap = 64; }
void dynstr_append(DynStr *s, char c) {
    if (s->len + 1 >= s->cap) {
        s->cap *= 2;
        s->data = realloc(s->data, s->cap);
    }
    s->data[s->len++] = c;
    s->data[s->len] = '\0';
}
void dynstr_free(DynStr *s) { free(s->data); s->data = NULL; }
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved