C++程序的入口函数是main函数,除了常见的无参数形式外,main函数还可以接收命令行传入的参数,这两个参数分别是argc和argv,理解它们的含义和使用方式是处理命令行参数的基础。

argc和argv的基本含义
main函数的带参数形式通常写作int main(int argc, char* argv[])或者int main(int argc, char** argv),两种写法本质一致,其中两个参数的具体含义如下:
- argc:是argument count的缩写,表示命令行传入的参数总个数,这个值是整数类型,至少为1,因为程序本身的名称会被算作第一个参数。
- argv:是argument vector的缩写,是一个字符指针数组,每个元素指向一个命令行参数的字符串,数组的长度就是argc的值。
参数传递规则
当我们在命令行运行编译好的C++程序时,参数的传递规则是:程序名称之后的空格分隔的内容都会被当作命令行参数传入,参数中如果包含空格,需要用双引号包裹。
比如我们编译生成的可执行文件名为test.exe,在命令行输入test.exe hello world 123,此时argc的值为4,argv数组的四个元素分别是:
- argv[0]:指向字符串"test.exe",即程序本身的名称
- argv[1]:指向字符串"hello"
- argv[2]:指向字符串"world"
- argv[3]:指向字符串"123"
基础使用示例
下面是一个简单的示例程序,用来打印所有传入的命令行参数:
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
// 打印参数总个数
cout << "参数总个数: " << argc << endl;
// 遍历打印所有参数
for (int i = 0; i < argc; i++) {
cout << "第" << i << "个参数: " << argv[i] << endl;
}
return 0;
}
将上述代码编译后,在命令行运行程序名 参数1 参数2,就可以看到所有参数的输出结果。
参数解析的常见场景
判断参数是否足够
很多程序需要特定的参数才能运行,此时可以先判断argc的值是否满足要求:
#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char* argv[]) {
// 程序本身加一个参数,至少需要2个参数
if (argc < 2) {
cout << "使用方法: " << argv[0] << " 文件名" << endl;
return 1;
}
cout << "传入的文件名是: " << argv[1] << endl;
return 0;
}
参数类型转换
argv数组中的元素都是字符串类型,如果我们需要数值类型的参数,需要进行类型转换,比如将字符串转换为整数可以使用atoi函数:
#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char* argv[]) {
if (argc < 3) {
cout << "请输入两个整数参数" << endl;
return 1;
}
// 将字符串参数转换为整数
int a = atoi(argv[1]);
int b = atoi(argv[2]);
cout << "两数之和为: " << a + b << endl;
return 0;
}
注意事项
- argv数组的最后一个元素之后是空指针,也就是argv[argc]的值为NULL,部分场景下可以利用这个特性做遍历判断。
- 如果命令行参数包含中文,需要注意控制台的编码设置,避免出现乱码问题。
- 不要修改argv数组中的内容,这些字符串的内存由系统管理,随意修改可能导致未知错误。