argc 與 argv 參數
C 語言程式的 main
函數如果不需要讀取任何來自於命令列的參數,則 main
函數就使用最簡單的寫法即可:
#include <stdio.h>
int main() {
return 0;
}
若需要將執行程式時,使用者所輸入的命令列參數讀取進來,則可在 main
函數中加上 argc
與 argv
兩個參數:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("We have %d arguments:\n", argc);
for (int i = 0; i < argc; ++i) {
printf("[%d] %s\n", i, argv[i]);
}
return 0;
}
使用 gcc
編譯:
gcc source.c
執行時就可以在命令列輸入要傳給程式的參數:
./a.out G. T. Wang
We have 4 arguments: [0] ./a.out [1] G. [2] T. [3] Wang
argv
陣列中包含了在命令列中所輸入的每一個參數,其中第一個元素是程式本身的名稱(在這裡就是./a.out
),之後就是執行時所輸入的各個參數,其排列順序就跟輸入時的順序相同。而 argc
是一個整數,其值就是 argv
陣列的長度。
若執行程式時,不加任何參數,argv
的長度(argc
的值)就會是 1
,也就是說 argv
就只包含程式本身的名稱:
./a.out
We have 1 arguments: [0] ./a.out
這是 C++ 版本的程式碼,argc
與 argv
的用法完全相同:
#include <iostream>
int main(int argc, char *argv[]) {
std::cout << "We have " << argc << " arguments" << std::endl;
for (int i = 0; i < argc; ++i) {
std::cout << "[" << i << "] " << argv[i] << std::endl;
}
return 0;
}
使用 g++
編譯:
g++ source.cpp
執行:
./a.out G. T. Wang
We have 4 arguments [0] ./a.out [1] G. [2] T. [3] Wang
有些人會把 *argv[]
寫成 **argv
這種不同的寫法,就像這樣:
int main(int argc, char **argv) {
// ...
}
兩種不同的寫法都是通用的,使用上沒有太大的差異。