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

打造保留視覺效果的 grep 類工具:bl2 專案深度解析

     編輯:關於C語言

專案簡介

本專案實作了一個類似 grep 的文本搜尋工具 bl2,但其獨特之處在於能夠完整保持原始文本的視覺效果。透過 ANSI 轉義序列為匹配關鍵字著色,使搜尋結果在終端機中以彩色高亮顯示,極大地提升了可讀性。專案包含四個核心檔案:myst_color.c、myst_color.h、bl2.c 以及 Makefile。

核心模組:myst_color — 色彩管理引擎

myst_color.c/h 定義了一個雙向鏈表結構 NODE,用於逐字元儲存文本內容及其對應的顏色屬性。這是實現「視覺效果保留」的關鍵——程式不直接處理字串,而是將文件轉換為節點串列,每個節點獨立攜帶顏色資訊。

關鍵資料結構

typedef struct data {
    int val;               // 字元的 ASCII 值
    char *color;           // ANSI 顏色代碼,如 "\33[1;31m" (亮紅)
    struct data *prev, *next; // 雙向鏈表指標
} NODE;

主要函式解析

  • init(FILE *fp):讀取檔案內容,逐字元建立節點,初始顏色設為預設灰色 \33[1;30m,返回鏈表頭指標。
  • rand_color(int num):從預定義的 12 種顏色陣列中,根據隨機種子選取一種高亮顏色供關鍵字使用。
  • print(NODE *pNODE):遍歷鏈表,依序輸出節點的顏色代碼與字元,最後換行,實現彩色輸出。

主程式邏輯:bl2.c — 搜尋與高亮

bl2.c 是程式的入口點,處理命令列參數、呼叫初始化、執行搜尋匹配並觸發輸出。

參數與流程

  • 需兩個參數:argv[1] 為搜尋關鍵字,argv[2] 為目標檔案路徑。
  • 開啟檔案,呼叫 init() 建立字元鏈表,並透過 rand_color(1) 取得高亮顏色。

匹配演算法

程式採用雙指標回溯策略:

  1. 外層遍歷鏈表節點 node。
  2. 若當前字元與關鍵字首字元匹配,進入內層循環,嘗試連續匹配後續字元(node2 前進,ch 遞增)。
  3. 若成功匹配至關鍵字結尾(*ch == '\0'),則回溯(node2->prev),將匹配區間內所有節點的 color 更新為高亮色。
  4. 外層指標 node 繼續後移,尋找下一處匹配。

此演算法雖非最高效(如 KMP 或 Boyer-Moore),但對於教學與中小型文件足夠,且完美契合「逐字元著色」的資料結構設計。

建置系統:Makefile

提供標準的編譯規則,啟用嚴格警告(-Wall -Wextra -ansi -pedantic)與優化(-O3),生成執行檔 bl2。

總結與啟發

bl2 專案展示了如何將「資料結構(雙向鏈表)」與「終端機特性(ANSI 色碼)」結合,實現一個功能雖簡單但極具實用價值的工具。其設計思想——將文本離散化為可攜帶屬性的節點——可擴展至語法高亮編輯器、日誌分析器等更複雜的場景。

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