为什么需要 argc 和 argv?
一个简单的 C 程序通常只有一个 main 函数,它不接受任何参数,直接开始执行。

#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
这个程序每次运行都做同样的事情,但在很多实际应用中,我们希望程序在运行时能够接收不同的输入或配置,
copy source.txt destination.txt(一个复制程序,需要知道源文件和目标文件名)ping google.com(一个 ping 程序,需要知道要 ping 的主机名)my_program --help(一个程序,通过--help参数来显示帮助信息)
为了让程序能够接收这些在命令行中输入的参数,C 语言提供了 main 函数的另一种形式,它接受两个参数:argc 和 argv。
argc 和 argv 是什么?
argc 和 argv 是两个标准的变量名,你可以用其他名字,但约定俗成地使用 argc 和 argv。
argc - Argument Count (参数计数)
- 类型:
int - 含义:
argc是一个整数,代表命令行参数的总个数。 - 关键点: 这个计数包括程序名称本身,也就是说,即使你没有给程序任何参数,
argc的值至少也是1。
argv - Argument Vector (参数向量)
- 类型:
char *[](字符指针数组) 或者char **(指向字符指针的指针) - 含义:
argv是一个字符串数组,它存储了所有的命令行参数。 - 关键点:
argv[0]永远是程序的名称(或者启动程序时使用的路径)。argv[1]到argv[argc-1]是你实际传入的参数。- 数组的最后一个元素
argv[argc]是一个空指针 (NULL),这标志着数组的结束。
一个完整的例子
让我们写一个程序,它可以打印出所有接收到的命令行参数,并展示 argc 和 argv 的具体内容。

文件名: args_demo.c
#include <stdio.h>
int main(int argc, char *argv[]) {
// 打印参数的总个数 (argc)
printf("Number of arguments (argc): %d\n", argc);
printf("--------------------------------\n");
// 使用一个循环来遍历并打印所有参数
for (int i = 0; i < argc; i++) {
// 打印 argv[i] 指向的字符串
printf("Argument %d: %s\n", i, argv[i]);
}
return 0;
}
如何编译和运行?
-
编译:
gcc args_demo.c -o args_demo
这会生成一个可执行文件
args_demo(在 Windows 上是args_demo.exe)。 -
运行:
(图片来源网络,侵删)-
不带任何参数
./args_demo
输出:
Number of arguments (argc): 1 -------------------------------- Argument 0: ./args_demo分析:
argc是1,因为只有一个参数,就是程序本身。argv[0]是"./args_demo",即程序名。
-
带几个参数
./args_demo hello world 123
输出:
Number of arguments (argc): 4 -------------------------------- Argument 0: ./args_demo Argument 1: hello Argument 2: world Argument 3: 123分析:
argc是4,分别是./args_demo,hello,world,123。argv[0]是程序名。argv[1],argv[2],argv[3]分别是我们传入的"hello","world","123"。
-
一个更实用的例子:命令行计算器
让我们创建一个简单的计算器程序,它通过命令行接收两个数字和一个运算符。
文件名: calculator.c
#include <stdio.h>
#include <stdlib.h> // 用于 atoi 函数
int main(int argc, char *argv[]) {
// 检查参数数量是否正确
// 我们期望的程序调用格式是: ./calculator <num1> <operator> <num2>
// 所以总共有 4 个参数 (包括程序名)
if (argc != 4) {
printf("Usage: %s <num1> <operator> <num2>\n", argv[0]);
printf("Example: %s 5 + 3\n", argv[0]);
return 1; // 返回非零值表示错误
}
// 将字符串参数转换为数字
// atoi 是一个标准库函数,用于将字符串转换为整数
int num1 = atoi(argv[1]);
int num2 = atoi(argv[3]);
// 获取运算符
char op = argv[2][0]; // 运算符是单个字符
int result;
// 根据运算符进行计算
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
// 检查除数是否为0
if (num2 == 0) {
printf("Error: Division by zero.\n");
return 1;
}
result = num1 / num2;
break;
default:
printf("Error: Invalid operator '%c'.\n", op);
return 1;
}
printf("%d %c %d = %d\n", num1, op, num2, result);
return 0;
}
如何编译和运行?
-
编译:
gcc calculator.c -o calculator
-
运行:
./calculator 10 \* 5
输出:
10 * 5 = 50注意: 在 Linux/macOS 的 shell 中, 是一个特殊字符(通配符),所以需要用反斜杠
\进行转义,写成\*,在 Windows 的命令提示符中,则不需要转义。
总结与关键点
| 概念 | 全称 | 类型 | 作用 |
|---|---|---|---|
argc |
Argument Count | int |
记录命令行参数的总数,包含程序名。 |
argv |
Argument Vector | char *[] |
一个字符串数组,存储所有参数。argv[0] 是程序名。 |
核心要点:
-
main函数的两种形式:int main(): 不带参数,用于简单程序。int main(int argc, char *argv[]): 带参数,用于需要命令行输入的程序。
-
argc总是 >= 1: 即使没有给程序任何参数,argc至少为 1,因为它总是包含程序路径。 -
argv的索引:argv[0]: 程序名称。argv[1]到argv[argc-1]: 用户传入的实际参数。argv[argc]:NULL,作为数组结束的标志。
-
参数是字符串:
argv中的所有参数都是字符串 (char *),如果你需要数字,必须使用像atoi()(ASCII to integer)、atof()(ASCII to float) 或更安全的strtol(),strtod()等函数进行转换。
掌握 argc 和 argv 是从编写简单脚本式程序转向构建更复杂、更灵活的命令行工具的关键一步。
