argc 是参数总数(含程序名),argv 是指向参数字符串数组的指针;例如 ./myapp -v --input data.txt 中 argc==4,argv[0] 为 "./myapp",argv[1] 至 argv[3] 为各参数。

在 C++ 程序中,main 函数可以接收命令行参数,最常见形式是 int main(int argc, char* argv[])。其中 argc 表示参数个数(含程序名),argv 是一个指向字符串数组的指针,每个字符串对应一个命令行参数。
argc 和 argv 是什么?
argc(argument count)是一个整数,记录你启动程序时输入的**所有参数总数**,包括可执行文件名本身。比如运行 ./myapp -v --input data.txt,那么 argc == 4。
argv(argument vector)是一个字符指针数组,argv[0] 总是程序名(如 "./myapp"),argv[1] 到 argv[argc-1] 依次是后续参数。注意:每个 argv[i] 都是以 '\0' 结尾的 C 风格字符串,可以直接用 std::string 包装或用 strcmp 比较。
如何安全地访问命令行参数?
直接访问 argv[i] 前必须确认 i ,否则越界读取会导致未定义行为。常见做法是先检查参数数量再解析。
立即学习“C++免费学习笔记(深入)”;
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
- 判断是否至少有 2 个参数(即带一个选项或输入文件):
if (argc \n"; return 1; } - 检查某个选项是否存在:
for (int i = 1; i - 获取选项后紧跟的值(如
-o output.txt):if (i + 1
更现代、更简洁的写法(C++11 起)
可以用 std::vector<:string> 封装全部参数,提高可读性和安全性:
int main(int argc, char* argv[]) {
std::vector args(argv, argv + argc);
// 现在 args[0] 是程序名,args.size() == argc
if (args.size() > 1 && args[1] == "--version") {
std::cout << "v1.0\n";
return 0;
}
} 这样避免了裸指针操作,也兼容标准算法(如 std::find),适合入门和中小型项目。
常见误区提醒
不要假设参数之间有空格就自动分割——shell 已完成分词,argv 中每个元素已是独立字符串。例如输入 ./app "hello world" -f,argv[1] 是 "hello world"(整体一个参数),不是两个。
-
argv中的字符串由操作系统提供,不能修改其内容(如argv[1][0] = 'X'是未定义行为) - 中文路径或含空格的参数必须用引号包裹,否则 shell 会拆开
- 如果不需要命令行参数,直接写
int main()更清晰,不必强行写argc/argv










