在 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