\0,佔 10 bytes)。#define CSTRSPACE 10000 // 總字元空間
#define NFLAGLEN (CSTRSPACE / 10) // 最大字串數 = 1000
char cStr[CSTRSPACE] = {0}; // 字串儲存區
int nFlag[NFLAGLEN] = {0}; // 0=空閒, 1=有效
void addString(char *pcStr, int *pnFlag) {
printf("請輸入字串(最長9字元):\n");
for (int i = 0; i < NFLAGLEN; i++) {
if (pnFlag[i] == 0) { // 找到空槽
scanf("%9s", pcStr + i * 10); // %9s 防溢位
while (getchar() != '\n'); // 清理輸入緩衝區
pnFlag[i] = 1;
printf("新增成功!索引:%d\n\n", i);
return;
}
}
printf("儲存空間已滿!\n\n");
}
void delString(char *pcStr, int *pnFlag) {
searchString(pcStr, pnFlag); // 先顯示現有內容
printf("請輸入要刪除的索引:\n");
int idx;
if (scanf("%d", &idx) != 1) return;
while (getchar() != '\n');
if (idx >= 0 && idx < NFLAGLEN && pnFlag[idx] == 1) {
pnFlag[idx] = 0; // 僅清旗標,資料保留直到被覆寫
printf("刪除成功!\n\n");
} else {
printf("索引無效或該槽位已空!\n\n");
}
}
void searchString(char *pcStr, int *pnFlag) {
printf("\n=== 目前儲存內容 ===\n");
bool any = false;
for (int i = 0; i < NFLAGLEN; i++) {
if (pnFlag[i] == 1) {
printf("%3d: %s\n", i, pcStr + i * 10);
any = true;
}
}
if (!any) printf("(空)\n");
printf("====================\n\n");
}
int main(void) {
char *pcStr = cStr;
int *pnFlag = nFlag;
int choice;
while (1) {
printf("1. 新增字串\n2. 刪除字串\n3. 查詢列印\n0. 結束\n請選擇:");
if (scanf("%d", &choice) != 1) { while(getchar()!='\n'); continue; }
while (getchar() != '\n');
switch (choice) {
case 1: addString(pcStr, pnFlag); break;
case 2: delString(pcStr, pnFlag); break;
case 3: searchString(pcStr, pnFlag); break;
case 0: return 0;
default: printf("無效選項!\n\n");
}
}
}
本實作限定定長,簡單高效。若需支援變長字串,面臨挑戰:
這正是檔案系統配置器面臨的核心問題。本程式可作為理解配置器原型的教學範例。
定長字串陣列管理展示了「陣列 + 位圖/旗標」的經典資料結構模式:O(1) 存取、O(N) 分配/掃描、零碎片(定長特性)。理解此模型有助於進階學習記憶體池、物件池、檔案系統區塊管理等核心系統元件。