6.5 命令行参数

本篇学习 `argc`、`argv`、参数校验与字符串转数字的基本方法,并能编写可从命令行接收参数的 C 程序。

命令行参数

概念说明

命令行参数允许程序在启动时接收外部输入,而不必每次运行后再交互式输入。 这类方式非常适合脚本工具、批处理程序和命令行小工具。

在 C 里,main 函数常见的写法有两种:int main(int argc, char *argv[])int main(int argc, char **argv)。 这两种写法在这里可以理解为等价,核心区别不在语义,而在写法风格。

其中 argc 表示参数个数,argv 表示参数字符串数组。 程序名本身通常也会算作一个参数,所以即使用户没有额外传参,argc 一般也至少是 1。

语法/规则

  1. main 常见写法是 int main(int argc, char *argv[])int main(int argc, char **argv)
  2. argc 至少为 1,因为程序名本身通常就占 argv[0]
  3. argv[0] 一般是程序名或程序路径,真正的用户参数从 argv[1] 开始读取。
  4. 使用参数前应先检查 argc,避免访问不存在的元素。
  5. 命令行参数默认都是字符串;如果要转成数字,strtolstrtod 一般比 atoiatof 更适合做错误检查。
  6. 多个参数之间默认用空格分隔;如果单个参数本身包含空格,传参时通常要用引号包起来。
  7. 实际项目中,命令行参数常用于传递配置文件路径、输入输出文件名、调试开关和模式选项。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    char *end1;
    char *end2;
    long a;
    long b;

    if (argc != 3) {
        fprintf(stderr, "usage: %s <a> <b>\n", argv[0]);
        return EXIT_FAILURE;
    }

    errno = 0;
    a = strtol(argv[1], &end1, 10);
    if (errno != 0 || *end1 != '\0') {
        fprintf(stderr, "invalid integer: %s\n", argv[1]);
        return EXIT_FAILURE;
    }

    errno = 0;
    b = strtol(argv[2], &end2, 10);
    if (errno != 0 || *end2 != '\0') {
        fprintf(stderr, "invalid integer: %s\n", argv[2]);
        return EXIT_FAILURE;
    }

    printf("program = %s\n", argv[0]);
    printf("sum = %ld\n", a + b);
    return EXIT_SUCCESS;
}

输出结果:

1
2
3
demo 3 4
program = demo
sum = 7

argv[0] 的实际内容和运行环境有关。 有的平台会显示 demo,有的平台会显示 demo.exe,也有可能直接显示完整路径。

常见错误

  1. 不检查 argc 就直接使用 argv[1]argv[2],导致越界访问。
  2. 直接用 atoi 处理用户输入,却没有检测转换失败的情况。
  3. 忽略带空格参数需要加引号这一点,导致实参数量和预期不一致。
  4. argv 里的字符串当成整数直接计算,却没有先完成合法转换。
  5. 在函数参数里对数组使用 sizeof 试图计算实参数量,结果得到的是指针大小而不是真实元素个数。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字