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)
參數解說
- argc (Argument Count):也就是參數的數量。
- 注意:程式本身的名稱也算一個參數。所以如果沒有傳入其他參數,
argc至少會是 1。
- 注意:程式本身的名稱也算一個參數。所以如果沒有傳入其他參數,
- 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 file2 或 grep "text" file 這樣可以用指令控制的實用工具了。