首页 > 其他分享 >getopt函数的使用

getopt函数的使用

时间:2024-09-25 23:01:48浏览次数:9  
标签:opt 函数 使用 argv break 参数 printf getopt

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;
}

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]

标签:opt,函数,使用,argv,break,参数,printf,getopt
From: https://www.cnblogs.com/dylaris/p/18432393

相关文章

  • matlab实验三(冒泡排序,sort函数,斜抛运动与绘图,循环确定(银行存利息))
    1.在MATLAB中使用循环结构对给定的数列A=[33,689,-705,2024,-6,29]进行升序排序。(注意:不可以使用任何MATLAB自带的排序函数直接操作。)%给定数列A=[33,689,-705,2024,-6,29];%获取数列长度n=length(A);%冒泡排序算法fori=1:n-1forj=1:n-i......
  • 使用 Vue3、TypeScript 和 Spring Boot 实现文件上传至 MinIO 和 OSS
    目录《使用Vue3、TypeScript和SpringBoot实现文件上传至MinIO和OSS》一、技术选型二、环境搭建三、前端实现四、后端实现五、代码解析在现代web应用开发中,文件上传是一个常见的需求。本文将介绍如何使用Vue3、TypeScript和SpringBoot实现文件上传功能,并......
  • Windows使用使用旧版有道云客户端导出所有笔记
    使用旧版有道云笔记客户端导出所有笔记最近在复习之前的笔记,边复习边整理,准备把之前在有道云笔记的文档全部整理导出,原因你懂得(有道云笔记是越做越烂了!!!),有道云笔记新版本的客户端不支持导出所有笔记。依稀记得老版本好像是支持全部导出的,我找到了2年前保存的旧版本的客户......
  • 20 函数去上级查找 案例
    去上级查找-案例1size=19func_list=[lambda:1+size,lambda:2+size,lambda:3+size]#此时函数体中没有size,会去上层或者全局变量里面查找,然后将2+size的值进行返回ret=func_list[0]()#func_list[0]内部不可见,只有加()才会执行1func_list[1]()#2......
  • 06 函数返回值
    6、函数返回值P93deffunc(arg):#....return9#返回值为9默认:returnNoneval=func('adsfadsf')#1.让用户输入一段字符串,计算字符串中有多少A字符的个数。有多少个就在文件a.txt中写多少个“李邵奇”。defget_char_count(data):sum_counter=0......
  • 05 函数练习
    5、函数练习题#1.请写一个函数,函数计算列表info=[11,22,33,44,55]中所有元素的和。defget_sum():info=[11,22,33,44,55]data=0foritemininfo:data+=itemprint(data)get_sum()#2.请写一个函数,函数计算列表中所有元素的和。......
  • 04 函数参数 形参 实参
    4、函数参数形参、实参、defget_list_first_data(aaa):#aaa叫形式参数(形参)v=[11,22,33,44]print(v[aaa])get_list_first_data(1)#2/2/1调用函数时传递叫:实际参数(实参)get_list_first_data(2)get_list_first_data(3)get_list_first_data(0)#假如:管理......
  • 07 函数练习二
    8、练习题2P94#1.写函数,计算一个列表中有多少个数字,打印:列表中有%s个数字。#提示:type('x')==int判断是否是数字。"""#方式一:defget_list_counter1(data_list):count=0foritemindata_list:iftype(item)==int:count+=......
  • 08 函数知识点回顾
    函数基本结构deffunc(name,age,email):#函数体(保持缩进一致)a=123print(a)return1111#return后面的语句不会执行 b=456result=func(1,2,3)#函数默认返回值:None函数参数deffunc(n1,n2):print(n1,n2)func(1,2)func(1,[11,22......
  • 08 函数参数详解
    3、函数参数-详解p104105函数参数不能设置成可变类型,有坑基本参数知识任意个数任意类型deffunc(a1,a2,a3):print(a1,a2,a3)func(1,"asdf",True)位置参数(位置传参)位置传参(调用函数并传入参数)【执行】deffunc(a1,a2):print(a1,a2)func(1,3......