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

C++ 動態字串輸入:處理變長輸入的兩種經典策略

     編輯:程式設計綜合問答

題目要求

從標準輸入讀取任意長度字串,存入動態配置的字元陣列,不使用 std::string,僅用陣列與指標實作。

策略 A:指數增長單一緩衝區(類 vector)

  1. 先配置固定容量 n(如 16 字元)。
  2. 逐字元讀取,計數器 len 記錄已讀長度。
  3. 當 len == capacity 時:
      配置新緩衝區 capacity * 2,
      memcpy 複製舊資料,
      釋放舊緩衝區,更新指標與容量。
  4. 讀到換行或 EOF 結束,最後在 buf[len] = '\0'。

優點:攤銷 O(1) 擴充,記憶體連續,快取友好。
缺點:需手動管理複製與釋放。

策略 B:區塊鏈結串列(類 rope)

  1. 定義結構體 Block { char data[BLOCK_SIZE]; Block* next; }。
  2. 維護頭尾指標,讀滿一塊即配置新節點掛在尾部。
  3. 讀完後依序遍歷鏈結串列輸出或合併為單一陣列。

優點:無需大块連續記憶體,擴充無複製開銷。
缺點:隨機存取慢,記憶體碎片化,遍歷輸出需額外迴圈。

完整範例(策略 A)

#include <cstdio>
#include <cstdlib>
#include <cstring>

int main() {
    size_t cap = 16, len = 0;
    char *buf = (char*)malloc(cap);
    int ch;
    while ((ch = getchar()) != EOF && ch != '\n') {
        if (len + 1 >= cap) {
            cap *= 2;
            buf = (char*)realloc(buf, cap);
        }
        buf[len++] = (char)ch;
    }
    buf[len] = '\0';
    printf("輸入長度 %zu:%s\n", len, buf);
    free(buf);
    return 0;
}

總結

指數增長單一緩衝區是處理變長輸入的工業界標準做法(std::string、std::vector 皆採用)。理解其原理有助於在受限環境下手寫高效動態字串。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved