0Pricing
C Academy · 课时

构建 CLI 工具

实际示例

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

综合运用

现在,我们将参数、选项和解析结合起来,构建一个小型但完整的CLI 工具。

示例是一个数字格式化工具:它读取一个值和几个选项,然后打印结果。

#include <stdio.h>

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

设计接口

优秀的 CLI 工具会预先定义好接口。我们的工具将接受:

  • -v:输出详细信息
  • -r N:将输出重复 N 次
  • 一个位置参数:要打印的文本
#include <stdio.h>

int main(void) {
    printf("Interface: prog [-v] [-r N] <text>\n");
    return 0;
}

声明设置

将每项可配置的行为存放在一个具有合理默认值的变量中。这样可以将解析过程与实际工作分离。

#include <stdio.h>

int main(void) {
    int verbose = 0;
    int repeat = 1;
    const char *text = NULL;
    printf("defaults: verbose=%d repeat=%d\n", verbose, repeat);
    return 0;
}

使用 getopt 进行解析

使用 getopt 填充标志。-r 需要一个值,因此它在选项字符串中的条目是 r:。

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

int main(int argc, char *argv[]) {
    int verbose = 0, repeat = 1, opt;
    while ((opt = getopt(argc, argv, "vr:")) != -1) {
        if (opt == 'v') verbose = 1;
        else if (opt == 'r') repeat = atoi(optarg);
    }
    printf("verbose=%d repeat=%d\n", verbose, repeat);
    return 0;
}

读取位置参数

getopt 执行完毕后,optind 指向第一个非选项参数。我们从那里获取文本。

如果不存在该参数,就打印用法说明,并以错误代码退出。

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    while (getopt(argc, argv, "vr:") != -1) { }
    if (optind >= argc) {
        printf("Error: missing text argument\n");
        return 1;
    }
    printf("text = %s\n", argv[optind]);
    return 0;
}

验证数字输入

健壮的工具会检查 -r 是否收到了合理的数字。请拒绝零次或负数次的重复次数。

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

int main(int argc, char *argv[]) {
    int repeat = 1, opt;
    while ((opt = getopt(argc, argv, "r:")) != -1) {
        if (opt == 'r') repeat = atoi(optarg);
    }
    if (repeat < 1) {
        printf("Error: repeat must be >= 1\n");
        return 1;
    }
    printf("repeat = %d\n", repeat);
    return 0;
}

执行任务

解析并验证设置后,执行实际任务。这里我们将文本打印 repeat 次。

#include <stdio.h>

int main(void) {
    const char *text = "hello";
    int repeat = 3;
    for (int i = 0; i < repeat; i++) {
        printf("%s\n", text);
    }
    return 0;
}

详细输出

详细标志可以添加诊断信息。请让这些打印操作受标志控制,从而保持正常输出简洁。

#include <stdio.h>

int main(void) {
    int verbose = 1;
    const char *text = "hi";
    if (verbose) printf("[debug] about to print text\n");
    printf("%s\n", text);
    return 0;
}

完整工具

下面是将所有部分串联起来的完整程序:解析、验证,然后运行。

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

int main(int argc, char *argv[]) {
    int verbose = 0, repeat = 1, opt;
    while ((opt = getopt(argc, argv, "vr:")) != -1) {
        if (opt == 'v') verbose = 1;
        else if (opt == 'r') repeat = atoi(optarg);
    }
    if (optind >= argc) { printf("Usage: prog [-v] [-r N] <text>\n"); return 1; }
    const char *text = argv[optind];
    if (verbose) printf("[debug] repeat=%d\n", repeat);
    for (int i = 0; i < repeat; i++) printf("%s\n", text);
    return 0;
}

退出代码很重要

CLI 工具通过退出代码传达执行是否成功。成功时返回 0,发生错误时返回非零值。

脚本和其他程序依靠这一点来决定下一步操作。

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("failure\n");
        return 2;
    }
    printf("success\n");
    return 0;
}

将错误写入 stderr

按照惯例,正常输出通过 stdout 输出,错误则通过 fprintf(stderr, ...) 输出到 stderr。

重定向输出时,用户可以据此将结果与诊断信息分开。

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        fprintf(stderr, "Error: need an argument\n");
        return 1;
    }
    printf("%s\n", argv[1]);
    return 0;
}

快速检查

测试您对 CLI 工具约定的理解。

回顾

您已经构建了一个完整的 CLI 工具:

  • 定义接口,并使用默认值声明设置。
  • 使用 getopt 解析标志;从 optind 读取位置参数。
  • 执行任务前验证输入。
  • 返回有意义的退出代码,并将错误发送到 stderr。

常见问题解答

「构建 CLI 工具」课时是免费的吗?

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

「构建 CLI 工具」这节课中我会学到什么?

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

学习 C Academy 需要有经验吗?

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

「构建 CLI 工具」课时需要多长时间?

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

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

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

此课程中的所有课时

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