C Academy · 课时

argc 与 argv

读取程序参数

第 1 / 4 课13 个步骤

argc 与 argv 是 CoddyKit 上的免费 C Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C Academy 课程共包含 4 节课。

程序会接收参数

从终端运行程序时,您可以向它传入额外的单词,这些单词称为命令行参数。

C 通过两个参数将它们传递给 main:argc(参数计数)和 argv(参数向量)。

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("This program received %d arguments\n", argc);
    return 0;
}

main 的函数声明

main 的完整形式是:

  • int main(int argc, char *argv[])

argc 是参数的数量。argv 是一个字符串指针数组,每个参数对应一个指针。

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("argc = %d\n", argc);
    return 0;
}

argv[0] 是程序名称

第一个元素 argv[0] 是用于调用程序的名称(或路径)。

因此,即使用户没有传入额外参数,argc 也至少为 1。

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Program name: %s\n", argv[0]);
    return 0;
}

打印所有参数

您可以从索引 0 循环到 argc - 1,访问 argv 中的每个参数字符串。

#include <stdio.h>

int main(int argc, char *argv[]) {
    for (int i = 0; i < argc; i++) {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
    return 0;
}

argv 以 NULL 结尾

根据 C 标准,argv[argc] 保证是一个 NULL 指针。

这意味着您可以循环读取,直到遇到 NULL,而不使用 argc;不过,使用 argc 计数更为常见。

#include <stdio.h>

int main(int argc, char *argv[]) {
    char **p = argv;
    while (*p != NULL) {
        printf("%s\n", *p);
        p++;
    }
    return 0;
}

参数始终是字符串

每个参数都会以字符串的形式传入,即使它表示数字也是如此。如果用户传入 42,您接收到的是文本 "42",而不是整数。

您必须使用 atoi 或 strtol 等函数自行进行转换。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    if (argc > 1) {
        int n = atoi(argv[1]);
        printf("Number plus one is %d\n", n + 1);
    } else {
        printf("Pass a number\n");
    }
    return 0;
}

检查参数数量

读取 argv[i] 之前,务必先验证 argc。访问超出所提供参数范围的索引会导致未定义行为。

典型的保护逻辑会检查是否提供了足够的参数,否则就打印用法说明。

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("Usage: %s <name>\n", argv[0]);
        return 1;
    }
    printf("Hello, %s!\n", argv[1]);
    return 0;
}

使用非零退出代码

参数不正确时,从 main 返回一个非零值,向 shell 表示执行失败。

按照惯例,0 表示成功,其他任何值都表示发生了错误。

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc != 3) {
        printf("Need exactly 2 arguments\n");
        return 1;
    }
    printf("Got both arguments\n");
    return 0;
}

对数字参数求和

一个实用示例是:使用 atoi 将命令行传入的每个数字转换后累加,得到总和。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int sum = 0;
    for (int i = 1; i < argc; i++) {
        sum += atoi(argv[i]);
    }
    printf("Sum = %d\n", sum);
    return 0;
}

argv 的另一种写法

您可能会看到 char **argv,而不是 char *argv[]。作为函数参数时,它们含义相同:都是指向第一个字符串指针的指针。

两种写法都可以使用 argv[i] 进行索引。

#include <stdio.h>

int main(int argc, char **argv) {
    if (argc > 1)
        printf("First arg: %s\n", argv[1]);
    return 0;
}

回显参数

经典的 echo 命令只负责打印其参数。下面是一个用空格连接参数的最简版本。

#include <stdio.h>

int main(int argc, char *argv[]) {
    for (int i = 1; i < argc; i++) {
        printf("%s", argv[i]);
        if (i < argc - 1) printf(" ");
    }
    printf("\n");
    return 0;
}

快速检查

测试您对 argc 和 argv 的理解。

回顾

您已经学习了程序如何读取命令行输入:

  • main(int argc, char *argv[]) 接收参数数量和参数数组。
  • argv[0] 是程序名称;实际参数从索引 1 开始。
  • argv[argc] 是 NULL。
  • 参数始终是字符串;使用 atoi 转换数字,并先验证 argc。
免费开始

用 AI 导师学习 C — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
39
课程
144

常见问题解答

「argc 与 argv」课时是免费的吗?

是的 — 「argc 与 argv」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C Academy 课程的其余内容,请升级到 CoddyKit PRO。 C Academy 课程共包含 4 节课。

「argc 与 argv」这节课中我会学到什么?

读取程序参数 你通过在浏览器中直接运行的动手代码来练习 C Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「argc 与 argv」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C Academy 课中编写并运行代码吗?

能。每节 C Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. argc 与 argv
  2. 解析选项
  3. getopt
  4. 构建 CLI 工具
← 返回 C Academy