前言
相信大家写 C++ 程序,都会有一个 main 函数作为程序的入口。入门时你可能只见过没带参数的 main 函数:
int main()
{
return 0;
}
而比较少见带参数的 main 函数:
int main(int argc, char* argv[])
{
return 0;
}
下面我将说说 带参 main 函数 的作用:
命令行参数
1. 先看个例子
现有目录结构如下:
hello.cpp 内容如下:
我们使用命令行调用 lex.exe,即可运行程序,打印 “hello”:
有时我们需要根据一些输入判断程序该如何执行,比如:
- 输入 1:程序输出 hello1
- 输入 2:程序输出 hello2
- 以此类推… …
那么我们怎么实现?可能你首先想到的是使用 cin:
#include <iostream>
using namespace std;
int main()
{
int n;
cout << "> ";
cin >> n;
cout << "hello" << n << endl;
return 0;
}
当然,这也可以。但是你会发现个问题: 只有你运行了程序后,才能开始输入
或许你觉得不就多了一步嘛,有什么麻烦的。但是如果此程序你会频繁地使用此程序,那么你是不是就需要频繁地打开程序,然后再输入。
之前我做过一个类似的程序就是这个样子的,后面用多了发现特麻烦,影响心情
那么可不可以在打开程序之前就能进行输入呢?带参的 main 函数就可以实现此功能。
2. int main(int argc, char* argv[])
就参数名来看
- argc:argument count
- argv:argument vector
你也能大概猜出它们的作用。
先看 argv
2.1 argv
其类型为 char指针数组,因此也可换为 char** argv。
如果你对此类型有些陌生,难以理解,你可以简单地将它看做一个 字符串数组
它的作用是接受 命令行输入的多个字符串 (这由操作系统实现)
参数遵循按 空白字符 分隔,但是不同的终端也会增加一些额外的规则,比如
- “” 之间的内容作为一个整体
- " ; " 作为命令分隔符
- … …
比如:
int main(int argc, char* argv[])
{
for (int i = 0; i < argc; i++) {
cout << "argv" << i << " = " << argv[i] << endl;
}
return 0;
}
采用命令行运行:
可以看出,argv[0] 为 程序名称(称为 指令),而 argv[1] 及之后的为命令行输入的 指令 后所跟的字符串(称为 参数)。
2.2 argc
其类型为 int,据名称也可看出它是用来保存 argv 中元素的个数,我们可以用它来遍历 argv 中的元素。
3. 之前我们说了要实现
- 输入 1:程序输出 hello1
- 输入 2:程序输出 hello2
- 以此类推… …
结合上面说的,那么我们就可以采用 带参 main 函数 来解决此问题:
int main(int argc, char* argv[])
try{
if (argc != 2) throw string{"argument error"}; // 只接受一个参数
cout << "hello" << argv[1] << endl;
return 0;
}
catch (string& e)
{
cerr << e << endl;
return 1;
}
命令行运行: