int main(int argc, char **argv)
是 C 语言中主函数的标准形式,用于接收命令行参数。具体参数含义如下:
参数解析
参数 | 类型 | 说明 |
---|---|---|
argc |
int |
参数计数(Argument Count),表示命令行参数的总个数(含程序名) |
argv |
char ** |
参数向量(Argument Vector),存储所有命令行参数的字符串指针数组 |
参数示例
假设编译后的程序名为 demo
,执行命令:
bash
./demo hello world 123
则参数对应关系为:
c
argc = 4
argv[0] = "./demo" // 程序自身路径
argv[1] = "hello" // 第一个参数
argv[2] = "world" // 第二个参数
argv[3] = "123" // 第三个参数
argv[4] = NULL // 数组结尾标识
内存结构示意图
text
argv
│
├── [0] → "./demo\0" ← 程序名
├── [1] → "hello\0" ← 第一个参数
├── [2] → "world\0" ← 第二个参数
├── [3] → "123\0" ← 第三个参数
└── [4] → NULL ← 结束标志
使用场景
-
基础参数获取:
cfor (int i = 0; i < argc; i++) { printf("参数 %d: %s\n", i, argv[i]); }
-
参数类型转换:
cif (argc > 3) { int num = atoi(argv[3]); // 将字符串"123"转为整数123 }
-
选项解析 (如
-f file.txt
):cif (strcmp(argv[1], "-f") == 0 && argc > 2) { FILE *fp = fopen(argv[2], "r"); }
注意事项
-
参数边界检查:
cif (argc < 2) { printf("错误:缺少参数!\n"); exit(1); }
-
安全处理:
- 使用
strncmp
替代strcmp
防止缓冲区溢出 - 用
strtol
替代atoi
以检测数值转换错误
- 使用
扩展知识
char *argv[]
与char **argv
等价,两者都是指针数组的表示方式envp
参数 :部分系统支持int main(int argc, char **argv, char **envp)
,其中envp
存储环境变量
理解这些参数是开发命令行工具的基础,例如 gcc
、ls
等命令都依赖参数输入。