在学习 C 或 C++ 编程语言时,我们经常会看到如下形式的 main 函数:
int main(int argc, char* argv[]) {
// ...
}
初学者可能会疑惑:这两个参数到底是干嘛用的?如果不需要输入参数,是不是可以不用写它们?
今天这篇文章就来系统地解释一下 argc 和 argv 是什么、它们在命令行程序中扮演了什么角色。
一、argc 和 argv 是什么?
在 C/C++ 中,程序的入口是 main() 函数。它的两个参数:
- argc:Argument Count,表示命令行参数的个数;
- argv:Argument Vector,是一个字符串数组,用来存储每个参数的内容。
它们让你的程序能接收来自命令行的外部输入参数。
示例:命令行运行一个程序
./my_program file.txt 123 -v
这行命令实际上给程序传入了 4 个参数:
索引 | 参数内容 | 说明 |
---|---|---|
0 | ./my_program | 程序自身的路径(默认存在) |
1 | file.txt | 用户自定义参数 |
2 | 123 | 用户自定义参数 |
3 | -v | 用户自定义参数(常用作开关) |
这时:
- argc = 4
- argv[0] = “./my_program”
- argv[1] = “file.txt”
- argv[2] = “123”
- argv[3] = “-v”
二、用法举例
打印出所有命令行参数:
#include <iostream>
int main(int argc, char* argv[]) {
std::cout << "参数个数: " << argc << std::endl;
for (int i = 0; i < argc; ++i) {
std::cout << "参数 " << i << ": " << argv[i] << std::endl;
}
return 0;
}
运行:
./demo hello world
输出:
参数个数: 3
参数 0: ./demo
参数 1: hello
参数 2: world
三、注意事项
- argv[0] 是程序路径名,即使没有传入任何自定义参数,也至少有一个参数;
- argv[i] 是 C 风格字符串(char),可以用 std::string 来转换使用;
- 程序不要越界访问 argv[argc] 以外的内容,否则会导致未定义行为。
四、是否可以省略 argc 和 argv
当然可以,如果你的程序根本不依赖命令行参数,可以这么写:
int main() {
// 不用 argc 和 argv
return 0;
}
但一旦你想要外部用户传参给你的程序,就建议使用 main(int argc, char* argv[]) 的形式。
五、总结
名称 | 含义 | 示例值 |
---|---|---|
argc | 参数个数 | 4 |
argv | 参数数组(C 字符串数组) | argv[1] = "input.txt" |