构建 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 反馈 — 无需本地设置。
此课程中的所有课时
- argc 与 argv
- 解析选项
- getopt
- 构建 CLI 工具