輸入不定長字符串,遇到特定字符(如 '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) 擴容成本。tmp 接收,失敗時原指針仍有效,避免內存洩漏。'0' 和 EOF (Ctrl+D/Z)。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; }