getopt函数

int getopt(int argc, char * const argv[], const char *optstring);
  • 头文件: #include<unistd.h>

  • 参数

    • argc: 命令行参数的数量
    • argv: 一个字符串数组,包含所有命令行参数
    • optstring: 一个字符串,定义了合法的选项字符(例如:"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;
}

1

在这个例子中,我们可以看到所谓选项就是前面加一个横杠的,然后如果我们设置的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;
}

2

可以看到这里-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;
}

3

optind指向没有被处理的命令行参数,可以对照下argv[optind]

 posted on 2024-09-25 23:05  Dylaris  阅读(80)  评论(0)    收藏  举报