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

C語言命令行參數深度解析:從argc/argv到模擬DIR命令實戰

     編輯:關於C語言

命令行參數基礎機制

C程序入口 main(int argc, char *argv[]) 接收兩個參數:

  • argc:參數總數(含程序名本身)
  • argv:字符串指針數組,argv[0] 為程序路徑,argv[1] 起為實際參數

基礎參數解析範例

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("程序名: %s\n", argv[0]);
    printf("參數個數: %d\n", argc);
    for (int i = 0; i < argc; i++) {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
    return 0;
}

運行 ./demo arg1 arg2 輸出:

程序名: ./demo
參數個數: 3
argv[0] = ./demo
argv[1] = arg1
argv[2] = arg2

實戰:模擬DIR命令參數處理

需求:接受盤符(C:)、路徑(C:\Windows)、文件名(test.txt)或無參數(默認 *.*),自動補全通配符並列出文件。

核心邏輯流程

  1. 參數檢查:argc==2 取 argv[1],否則默認 *.*
  2. 路徑判斷:以 \ 或 : 結尾視為目錄,補全 *.*
  3. 路徑分離:提取目錄部分供 chdir() 切換,保留文件模式匹配
  4. 文件遍歷:findfirst()/findnext() 獲取文件信息
  5. 分頁顯示:每23行暫停,按鍵繼續

關鍵代碼片段

#include <stdio.h>
#include <string.h>
#include <dir.h>     // findfirst/findnext
#include <dos.h>     // getcwd/chdir

void main(int argc, char *argv[]) {
    struct ffblk f;
    char pattern[20], path[50], dirpart[50];
    int done, count = 0, line = 1;

    // 1. 參數處理與通配符補全
    if (argc == 2) strcpy(pattern, argv[1]);
    else strcpy(pattern, "*.*");

    int len = strlen(pattern);
    if (pattern[len-1] == '\\' || pattern[len-1] == ':') 
        strcat(pattern, "*.*");

    // 2. 目錄切換與路徑分離
    getcwd(path, 50);
    if (chdir(pattern) == 0) {  // 是目錄
        strcat(pattern, "\\*.*");
        chdir(path); // 恢復原目錄
    }
    strcpy(dirpart, pattern);
    for (int i = strlen(dirpart)-1; i >= 0; i--) {
        if (dirpart[i] == '\\' || dirpart[i] == ':') {
            dirpart[i+1] = '\0';
            break;
        }
    }
    if (strlen(dirpart) == 0) strcpy(dirpart, path);

    // 3. 文件查找循環
    printf("模擬DIR命令 目錄: %s\n", dirpart);
    done = findfirst(pattern, &f, FA_ARCH | FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_DIREC | FA_LABEL);
    while (!done) {
        if (!(f.ff_attrib & FA_DIREC))
            printf("%-15s %10ld\n", f.ff_name, f.ff_fsize);
        else
            printf("%-15s \n", f.ff_name);

        count++; line++;
        if (line == 24) {
            printf("--- More (按任意鍵) ---");
            getch();
            line = 1;
            printf(" (目錄: %s)\n", dirpart);
        }
        done = findnext(&f);
    }
    printf("共 %d 個文件\n", count);
}

進階技巧與注意事項

  • 路徑分隔符:Windows雙反斜杠 \\,Linux單斜杠 /,可用 #ifdef _WIN32 區分
  • 長文件名:舊API findfirst 僅支援8.3格式,現代代碼應用 FindFirstFileW (Windows) 或 opendir/readdir (POSIX)
  • 參數引用:含空格路徑需加引號 "C:\Program Files",argv 自動去除引號
  • 標準庫替代:getopt() (POSIX) 或 CommandLineToArgvW (Windows) 處理複雜選項解析

現代化改造建議

生產環境建議使用成熟庫:

  • argparse (C++17風格)
  • CLI11 (頭文件-only,功能豐富)
  • cxxopts (類Boost.Program_options輕量版)

自行解析僅適合簡單場景或教學演示。

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