C 語言 main 函式參數與命令列引數(Command Line Arguments)

我們之前寫的 main 函式都長這樣:int main()。但其實 main 函式還可以接收參數,讓我們在執行程式的同時傳遞資訊給它。這在編寫 Linux 指令或工具軟體時非常常見。

main 函式的完整型態

int main(int argc, char *argv[]) {
    // ...
    return 0;
}

或是寫成 char **argv 也可以:

int main(int argc, char **argv)

參數解說

  1. argc (Argument Count):也就是參數的數量
    • 注意:程式本身的名稱也算一個參數。所以如果沒有傳入其他參數,argc 至少會是 1。
  2. argv (Argument Vector):這是一個字串陣列,儲存了所有的參數內容。
    • argv[0]:程式的執行路徑/名稱。
    • argv[1]:第一個參數。
    • argv[2]:第二個參數... 以此類推。
    • argv[argc]:永遠是 NULL

範例:打招呼程式

讓我們寫一個程式,執行時可以輸入名字,程式就跟他說 Hello。

// greet.c
#include <stdio.h>

int main(int argc, char *argv[]) {
    // 檢查是否有傳入參數
    // 為什麼是 2? 因為 argv[0] 是程式名,argv[1] 才是使用者的輸入
    if (argc < 2) {
        printf("用法: %s [名字]\n", argv[0]);
        return 1; // 回傳非 0 值表示發生錯誤或用法不對
    }

    printf("Hello, %s!\n", argv[1]);
    
    // 如果有多個參數
    if (argc > 2) {
        printf("哇!你好像帶了很多朋友來:\n");
        for (int i = 2; i < argc; i++) {
            printf("- %s\n", argv[i]);
        }
    }

    return 0;
}

編譯與執行

# 編譯
gcc greet.c -o greet

# 執行(不帶參數)
./greet
# 輸出:用法: ./greet [名字]

# 執行(帶參數)
./greet Mike
# 輸出:Hello, Mike!

# 執行(帶多個參數)
./greet Mike John Amy
# 輸出:
# Hello, Mike!
# 哇!你好像帶了很多朋友來:
# - John
# - Amy

透過這種方式,我們就可以寫出像 cp file1 file2grep "text" file 這樣可以用指令控制的實用工具了。