本篇教學介紹如何在 C/C++ 程式的 main 函數中,使用 argcargv 兩個參數,取得執行程式時所輸入的指令參數。

argcargv 參數

C 語言程式的 main 函數如果不需要讀取任何來自於命令列的參數,則 main 函數就使用最簡單的寫法即可:

#include <stdio.h>
int main() {
  return 0;
}

若需要將執行程式時,使用者所輸入的命令列參數讀取進來,則可在 main 函數中加上 argcargv 兩個參數:

#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++ 版本的程式碼,argcargv 的用法完全相同:

#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) {
  // ...
}

兩種不同的寫法都是通用的,使用上沒有太大的差異。

參考資料:GeeksforGeeks