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

C語言 main 函數參數詳解:argc、argv 命令列參數處理實戰

     編輯:關於C語言

main 函數的特殊地位

C 程式以函數組裝,main() 為程式進入點(主調函數)。一般函數分有參/無參,由 main 或其他函數調用並傳參。但 main 無法被其他函數調用,其參數只能由作業系統啟動時傳遞。

main 參數標準形式


main(int argc, char *argv[])
或
main(int argc, char **argv)
  • argc (argument count):整數,記錄命令列命令 + 參數總個數
  • argv (argument vector):指標陣列,argv[0] ~ argv[argc-1] 分別指向各字串

命令列與 main 參數對應關係

命令列格式:命令 參數1 參數2 ... 參數n
空格分隔,命令即可執行檔檔名(如 program.exe)。

對應範例


// 命令列:
program str1 str2 str3 str4 str5

// main 參數:
argc = 6  (program + 5 參數)
argv[0] = "program"     // 命令本身
argv[1] = "str1"
argv[2] = "str2"
argv[3] = "str3"
argv[4] = "str4"
argv[5] = "str5"
關鍵:argv[0] 永遠是命令/程式名,實際參數從 argv[1] 開始。

實戰範例:繪圖程式參數化

利用繪圖庫繪製變化圓環,參數從命令列輸入:基礎圓半徑 R1、小圓半徑 Rs、背景色。

程式碼


#include 
#include 
#include   // atoi()

#define PI 3.1415926

main(int argc, char *argv[]) {
    int x, y, r1, rs, color;
    double a;
    int gdriver = DETECT, gmode;

    initgraph(&gdriver, &gmode, "..\\bgi");  // 啟動繪圖模式

    // 從命令列取得參數(argv 為字串,需轉整數)
    r1 = atoi(argv[1]);      // 基礎圓半徑
    rs = atoi(argv[2]);      // 同心圓半徑
    color = atoi(argv[3]);   // 背景色

    cleardevice();           // 清除繪圖螢幕
    setbkcolor(color);       // 設定背景色
    setcolor(4);             // 設定繪圖顏色(紅)

    // 繪製 n 個同心圓(基礎圓周等分點為圓心)
    for (a = 0; a <= 2 * PI; a += PI / 18) {
        x = r1 * cos(a) + 320;  // 螢幕中心 (320,240)
        y = r1 * sin(a) + 240;
        circle(x, y, rs);       // 以 (x,y) 為圓心,半徑 rs 畫圓
    }

    getch();                 // 等待按鍵
    closegraph();            // 關閉繪圖模式
}

執行方式


// 編譯連結生成 L6-29.exe
// 命令列執行:
L6-29 40 20 3

// 對應:
argv[0] = "L6-29"
argv[1] = "40"  → r1 = 40
argv[2] = "20"  → rs = 20
argv[3] = "3"   → color = 3

關鍵技術點解析

1. 字串轉整數:atoi()

argv 元素為字串指標,數值參數需轉換:

  • atoi(s):字串 → int
  • atol(s):字串 → long
  • atof(s):字串 → double

需 #include 。

2. 參數數量檢查


if (argc < 4) {
    printf("Usage: %s   \n", argv[0]);
    exit(1);
}

防止缺參數導致存取越界崩潰。

3. argv 記憶體模型

  • argv 為指標陣列,每元素指向命令列對應字串
  • 字串儲存於系統分配區域,程式不可修改(行為未定義)
  • 若需修改,先 strcpy 複製到自有緩衝區

4. 進階:getopt() 解析選項

標準庫 unistd.h 提供 getopt() 處理 -x value 風格選項,支援:

  • 短選項:-a -b value
  • 長選項:--all --buffer=size(GNU 擴展)

main 返回值與程式結束碼


int main(int argc, char *argv[]) {
    ...
    return 0;  // 成功結束
}
  • return 0 / exit(0):正常結束
  • return 非零 / exit(非零):異常結束,供腳本/父程序判斷
  • 若 main 無 return,C99 保證隱性 return 0

環境變數:第三參數 envp(擴展)


main(int argc, char *argv[], char *envp[])  // 非標準但廣泛支援

envp 指向環境變數字串陣列(NAME=VALUE 格式),以 NULL 結尾。標準做法用 getenv() 存取。

總結

  1. main 可帶參數 argc、argv,由 OS 啟動時傳遞
  2. argc = 命令列總項目數(含命令),argv[i] 指向第 i 項字串
  3. argv[0] 為程式名,實際參數從 argv[1] 起
  4. 字串參數需 atoi/atol/atof 轉數值
  5. 務必檢查 argc 防越界,提供 Usage 提示
  6. 命令列參數化使程式具備腳本自動化、批次處理能力
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved