getopt函数
int getopt(int argc, char * const argv[], const char *optstring);
-
头文件:
#include<unistd.h>
-
参数:
- argc: 命令行参数的数量
- **argv*8: 一个字符串数组,包含所有命令行参数
- **optstring*8: 一个字符串,定义了合法的选项字符(例如:"abc:" 表示 -a, -b, 和 -c 需要参数)
-
返回值:
- 正常返回:返回下一个合法选项字符的ASCII码,若没有更多选项,则返回 -1
- 未识别的选项:当用户输入了一个 getopt 不认识的选项时,getopt 会返回 ?,此时 optopt 会被设置为该未知选项的字符
- 缺少参数的选项:当某个选项需要一个参数,但没有提供时,getopt 也会返回 ?,此时 optopt 会被设置为那个选项的字符
-
全局变量:
extern char *optarg; extern int optind, opterr, optopt;
- optarg: 指向当前选项的参数(如果有)
- optind: 下一个要处理的argv索引,初始值为1
- opterr: 用于控制是否打印错误信息,默认为1(打印)
- optopt: 保存未识别的选项字符,用于错误处理
代码演示
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt; // 捕捉到的选项
const char *optfmt = "a:bc:"; // -a带参数,b不带参数,-c带参数
while ((opt = getopt(argc, argv, optfmt)) != -1) {
switch (opt) {
case 'a':
printf("Catched option %c with %s\n", opt, optarg);
break;
case 'b':
printf("Catched option %c\n", opt);
break;
case 'c':
printf("Catched option %c with %s\n", opt, optarg);
break;
case '?':
printf("Unknown option %c\n", opt);
break;
default:
break;
}
}
return 0;
}
在这个例子中,我们可以看到所谓选项就是前面加一个横杠的,然后如果我们设置的optfmt就是选项,后面加上:就表示要携带参数才行,然后optarg就是指向这个参数
然后指定了选项并不是说就一定要用,还可以看到这里的-a如果没带参数会报错,这是因为opterr默认为1
当我们吧opterr设置为0,就是禁用了getopt自带的报错功能了
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt; // 捕捉到的选项
const char *optfmt = "a:bc:"; // -a带参数,b不带参数,-c带参数
opterr = 0; // 禁用getopt自带的报错
while ((opt = getopt(argc, argv, optfmt)) != -1) {
switch (opt) {
case 'a':
printf("Catched option %c with %s\n", opt, optarg);
break;
case 'b':
printf("Catched option %c\n", opt);
break;
case 'c':
printf("Catched option %c with %s\n", opt, optarg);
break;
case '?':
printf("Unknown option %c\n", opt);
break;
default:
break;
}
}
return 0;
}
可以看到这里-a不加参数,没有报错,只是打印了的内容是我们代码中的
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt; // 捕捉到的选项
const char *optfmt = "a:bc:"; // -a带参数,b不带参数,-c带参数
opterr = 0; // 禁用getopt自带的报错
while ((opt = getopt(argc, argv, optfmt)) != -1) {
switch (opt) {
case 'a':
printf("Catched option %c with %s\n", opt, optarg);
break;
case 'b':
printf("Catched option %c\n", opt);
break;
case 'c':
printf("Catched option %c with %s\n", opt, optarg);
break;
case '?':
printf("Unknown option %c\n", opt);
break;
default:
break;
}
}
// 检测optind
if (argv[optind])
printf("optind: %d to be handle %s\n", optind, argv[optind]);
return 0;
}
optind指向没有被处理的命令行参数,可以对照下argv[optind]
标签:opt,函数,使用,argv,break,参数,printf,getopt From: https://www.cnblogs.com/dylaris/p/18432393