在 C++ 中檢索命令列引數
-
使用
int main(int argc, char *argv[])
表示法來檢索 C++ 中的命令列引數 -
在 C++ 中使用
int main(int argc, char **argv)
表示法檢索命令列引數 -
在 C++ 中使用
while
迴圈來列印出命令列引數
本文將介紹幾種如何在 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);
}
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