開發一個命令列模式的文本編輯器,是理解文件操作、動態內存管理與指針運算的絕佳練習。本文展示一個支援編輯、替換、插入、刪除、退出等核心功能的 C 語言實現,並詳細解析關鍵邏輯與常見坑點。
| 命令 | 格式 | 說明 |
|---|---|---|
| E/e | E filename | 指定編輯文件,若不存在則創建 |
| Q/q | Q | 退出編輯器,可選擇保存 |
| R/r | R k m n | 用後續 k 行內容替換原文第 m 到 n 行 |
| I/i | I k m | 在原文第 m 行後插入 k 行新內容 |
| D/d | D m n | 刪除原文第 m 到 n 行 |
#define CHMAX 80 // 每行最大字符數 #define LINEMAX 200 // 最大行數 char *Line[LINEMAX]; // 行指針陣列,每項指向動態分配的行內容 int last = 0; // 當前文本實際行數
主循環讀取一行輸入,跳過前導空白,識別命令字符,通過函數指針陣列 comfunc 分發執行。注意輸入緩衝區殘留換行符的處理(bug1 註釋處)。
fopen "r" 讀取,失敗則 "w" 創建後再 "r" 打開。fgets 讀入 buffer,malloc 分配精確長度內存,strcpy 複製,掛載至 Line 陣列。last 與修改標誌 modified。k, m, n 合法性:k == n-m+1 且範圍在 [1, last]。k 個空位:Line[i+k] = Line[i]。last += k。Line[m+j-1] = Line[i]。last -= (n-m+1)。詢問是否保存,若是則 fopen "w" 逐行 fputs 寫回文件,最後 exit(0)。
fgets 保留 \n,若輸入行不足 CHMAX 且無換行,插入時會導致行粘連。建議統一補全換行符或用 getline(POSIX)。Line 所有內存,可在 Quit 中統一釋放。完整代碼與運行截圖見原文。此專案雖簡單,卻涵蓋了 C 語言系統編程的核心要素,值得深入研習與重構。