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

統計源代碼行數的 Shell 與 C 語言兩種實現方案詳解

     編輯:關於C語言

統計源代碼行數的 Shell 與 C 語言兩種實現方案詳解

統計專案代碼行數是常見需求。本文提供兩種 Linux 下實現:Shell 腳本版(簡潔強大,支援按後綴過濾、顏色輸出)與 C 語言版(系統編程實踐,遞歸遍歷目錄、fgets 逐行統計),並附完整代碼與運行截圖說明。

一、Shell 版:find + wc + awk 一體化

核心思路

  1. find $1 -maxdepth $2 -name "$3" 檢索目標文件。
  2. wc -l 統計每文件行數,輸出格式 行數 文件名。
  3. awk '{print $1}' 提取行數字段,累加總計。
  4. 用 ANSI 轉義碼為輸出添加顏色區分。

關鍵代碼片段

# 參數:$1=路徑 $2=最大深度 $3=文件後綴正則
for file in $(find "$1" -maxdepth "$2" -name "$3"); do
    t=$(wc -l < "$file")          # 只取行數,不含文件名
    echo -e "$file: \e[1;32m $t \e[0m"
    w=$((w + t))
done
echo -e "\e[1;31m total: \e[1;32m $w \e[0m"

優點

  • 幾行代碼完成複雜任務,體現 Shell 管道威力。
  • 靈活支援正則過濾文件類型(如 *.c、*.h)。

二、C 版:系統編程遞歸遍歷

核心 API

  • opendir/readdir/closedir(dirent.h)遍歷目錄。
  • chdir(unistd.h)切換工作目錄實現遞歸。
  • lstat + S_ISDIR(sys/stat.h)判斷文件類型。
  • fgets 逐行讀取統計。

完整代碼

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define MAXLINE 200
int linecount = 0;

int getLine(char *fname) {
    FILE *fp = fopen(fname, "r");
    char line[MAXLINE];
    int total = 0;
    while (fgets(line, MAXLINE, fp) != NULL) total++;
    fclose(fp);
    return total;
}

void Recur_dir(const char *dir, int depth) {
    DIR *dp; struct dirent *entry; struct stat statbuf;
    if ((dp = opendir(dir)) == NULL) { perror("opendir"); exit(1); }
    chdir(dir);
    while ((entry = readdir(dp)) != NULL) {
        lstat(entry->d_name, &statbuf);
        if (S_ISDIR(statbuf.st_mode)) {
            if (strcmp(".", entry->d_name)==0 || strcmp("..", entry->d_name)==0) continue;
            Recur_dir(entry->d_name, depth+4);
        } else {
            linecount += getLine(entry->d_name);
        }
    }
    chdir("..");
    closedir(dp);
}

int main(int argc, char *argv[]) {
    char *topdir = ".";
    if (argc > 2) { fprintf(stderr, "Usage: %s [dir]\n", argv[0]); exit(1); }
    if (argc == 2) topdir = argv[1];
    Recur_dir(topdir, 0);
    printf("Total: %d\n", linecount);
    return 0;
}

關鍵細節

  • 忽略 . 和 .. 避免死循環。
  • 遞歸進入子目錄後 chdir("..") 返回上層。
  • 統計所有文件行數,未按後綴過濾(可自行擴展)。

三、效果對比

四、總結

Shell 版適合臨時統計、CI/CD 流水線;C 版適合嵌入式環境、需集成到大型工具鏈、或作為系統編程練習。兩者思路互補,掌握雙重實現能靈活應對不同場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度Shell 版C 版
代碼量~20 行~80 行
靈活性高(管道組合)需手工擴展
性能進程開銷大單進程、較快
移植性依賴 GNU 工具標準 C,易移植