在 C++ 中檢索命令列引數

Jinku Hu 2023年1月30日 2021年4月29日
  1. 使用 int main(int argc, char *argv[]) 表示法來檢索 C++ 中的命令列引數
  2. 在 C++ 中使用 int main(int argc, char **argv) 表示法檢索命令列引數
  3. 在 C++ 中使用 while 迴圈來列印出命令列引數
在 C++ 中檢索命令列引數

本文將介紹幾種如何在 C++ 中檢索命令列引數的方法。

使用 int main(int argc, char *argv[]) 表示法來檢索 C++ 中的命令列引數

命令列引數是可以在執行開始時傳遞給程式的字串值。通常,這些引數被具有純 CLI 介面的程式廣泛使用,例如 Unix 命令列實用程式。請注意,C++ 程式應具有特殊的 main 函式定義以訪問命令列引數。即,main 函式應該包括以下引數 - (int argc, char *argv[])argc 參數列示傳遞給程式的引數總數,包括程式名稱本身。另一方面,argv 儲存表示引數值的字串陣列,可以使用陣列符號 argv[0] 對其進行訪問。注意,char 指標的陣列保證以 0 結束。

下面的示例演示 for 迴圈的基本用法,用於將每個引數值列印到控制檯。但是請注意,前面的 if 語句可確保程式指定了引數,然後繼續執行。

#include <iostream>
#include <string>

using std::cout;
using std::cerr;
using std::endl;
using std::string;

int main(int argc, char *argv[]) {

    if (argc < 2) {
        cerr << "No program parameters provided !" << endl;
        exit(EXIT_FAILURE);
    }

    for (int i = 0; i < argc; i++)
        printf("argv[%d] = %s\n", i, argv[i]);

    exit(EXIT_SUCCESS);
}

在 C++ 中使用 int main(int argc, char **argv) 表示法檢索命令列引數

還有另一個有效的 main 函式原型,其行為與上一個函式原型完全相同,因此我們將其包含在內,以確保在出現以下表示法時不會造成混淆-int main(int argc, char **argv)。注意,訪問元素的方式相同,可以使用 for 迴圈遍歷它們。

#include <iostream>
#include <string>

using std::cout;
using std::cerr;
using std::endl;
using std::string;

int main(int argc, char **argv) {

    if (argc < 2) {
        cerr << "No program parameters provided !" << endl;
        exit(EXIT_FAILURE);
    }

    for (int i = 0; i < argc; i++)
        printf("argv[%d] = %s\n", i, argv[i]);

    exit(EXIT_SUCCESS);
}

在 C++ 中使用 while 迴圈來列印出命令列引數

訪問引數值的另一種方法是解除對 argv 指標的引用,直到它等於零為止。請注意,保證 argv 陣列以零值結尾,我們可以利用它來實現 while 迴圈以遍歷陣列並一一列印出引數值。注意,下面的 if 語句中的 printf 呼叫充當錯誤報告程式,表明沒有將足夠的引數傳遞給程式。有趣的是,程式名稱是使用 argv[0] 表示法和%s 指示符進行檢索的,這使得它比每次更改名稱都要進行硬編碼都更加靈活。

#include <iostream>
#include <string>

using std::cout;
using std::cerr;
using std::endl;
using std::string;

int main(int argc, char *argv[]) {

    if (argc < 4) {
        printf("Usage: ./%s arg1 arg2 arg3\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    while (*argv) {
        cout << *argv << endl;
        argv += 1;
    }

    exit(EXIT_SUCCESS);
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn