首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

從零實現簡易文本編輯器:命令解析與行操作詳解

     編輯:關於C語言

從零實現簡易文本編輯器:命令解析與行操作詳解

開發一個命令列模式的文本編輯器,是理解文件操作、動態內存管理與指針運算的絕佳練習。本文展示一個支援編輯、替換、插入、刪除、退出等核心功能的 C 語言實現,並詳細解析關鍵邏輯與常見坑點。

功能命令設計

命令格式說明
E/eE filename指定編輯文件,若不存在則創建
Q/qQ退出編輯器,可選擇保存
R/rR k m n用後續 k 行內容替換原文第 m 到 n 行
I/iI k m在原文第 m 行後插入 k 行新內容
D/dD m n刪除原文第 m 到 n 行

核心數據結構

#define CHMAX 80      // 每行最大字符數
#define LINEMAX 200   // 最大行數
char *Line[LINEMAX];  // 行指針陣列,每項指向動態分配的行內容
int last = 0;         // 當前文本實際行數

關鍵函數邏輯解析

1. 命令解析循環

主循環讀取一行輸入,跳過前導空白,識別命令字符,通過函數指針陣列 comfunc 分發執行。注意輸入緩衝區殘留換行符的處理(bug1 註釋處)。

2. Edit():文件讀取與初始化

  • 使用 fopen "r" 讀取,失敗則 "w" 創建後再 "r" 打開。
  • 逐行 fgets 讀入 buffer,malloc 分配精確長度內存,strcpy 複製,掛載至 Line 陣列。
  • 更新 last 與修改標誌 modified。

3. Replace():行替換

  • 校驗參數 k, m, n 合法性:k == n-m+1 且範圍在 [1, last]。
  • 釋放舊行內存,讀入新行並重新分配掛載。

4. Insert():行插入

  • 從尾部向前移動指針,騰出 k 個空位:Line[i+k] = Line[i]。
  • 在空位處讀入新行內容並分配內存。
  • 更新 last += k。

5. Delete():行刪除

  • 釋放目標範圍內各行內存。
  • 後續行指針前移覆蓋:Line[m+j-1] = Line[i]。
  • 更新 last -= (n-m+1)。

6. Quit():退出與保存

詢問是否保存,若是則 fopen "w" 逐行 fputs 寫回文件,最後 exit(0)。

常見問題與改進方向

  • 輸入緩衝區殘留換行:首次讀命令前需清空 stdin 或調整讀取邏輯。
  • 行尾換行符處理:fgets 保留 \n,若輸入行不足 CHMAX 且無換行,插入時會導致行粘連。建議統一補全換行符或用 getline(POSIX)。
  • 內存洩漏風險:異常退出時未釋放 Line 所有內存,可在 Quit 中統一釋放。
  • 擴展性:引入雙向鏈表替代固定陣列,支援無限行數;加入撤銷/重做、查找替換等功能。

完整代碼與運行截圖見原文。此專案雖簡單,卻涵蓋了 C 語言系統編程的核心要素,值得深入研習與重構。

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