getopt函数分析命令行参数

函数声明
int getopt(int argc,char * const argv[ ],const char * optstring);
函数说明

getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。
参数optstring则代表欲处理的选项字符串。此函数会返回在argv中下一个的选项字母,此字母会对应参数optstring中的字母。如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg即会指向此额外参数。如果getopt()找不到符合的参数,则会打印出错信息,并将全域变量optarg设为“?”字符,如果不希望getopt()打印出错信息,则只要将全域变量opterr设为0即可。

返回值

getopt()每次调用会逐次返回命令行传入的参数。
当没有参数的最后的一次调用时,getopt()将返回-1。
当解析到一个不在optstring里面的参数,或者一个必选值参数不带值时,返回’?’。
当optstring是以’:’开头时,缺值参数的情况下会返回’:’,而不是’?’ 。

全局变量
  • char *optarg——当前选项参数字符串(如果有)。

  • int optind——argv的当前索引值。当getopt()在while循环中使用时,循环结束后,剩下的字串视为操作数,在argv[optind]至argv[argc-1]中可以找到。

  • int opterr——这个变量非零时,getopt()函数为“无效选项”和“缺少参数选项,并输出其错误信息。

  • int optopt——当发现无效选项字符之时,getopt()函数或返回’?’字符,或返回’:’字符,并且optopt包含了所发现的无效选项字符。

参数列表的定义

getopt()使用optstring所指的字串作为短参数列表,像ab:c::d就是一个短参数列表。短参数的定义是一个-后面跟一个字母或数字,像-a,-b就是一个短参数。每个数字或字母定义一个参数。

其中短参数在getopt定义里分为三种:

  • 不带值的参数,它的定义即是参数本身。
  • 必须带值的参数,它的定义是在参数本身后面再加一个冒号。
  • 可选值的参数,它的定义是在参数本身后面加两个冒号 。
注意
  • 参数的值与参数之间不能有空格,否则解析出错。
  • 不带值的参数可以连写,也可以分开写。
  • 参数不分先后顺序。

实例

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

extern char* optarg; /*指向当前getopt()返回选项的参数(如果有)*/
extern int   optopt; /*当选项没有出现在optstring中,或者选项缺少必要的参数时,该选项存储在optopt中,getopt返回'?’*/
extern int   opterr; /*用于控制getopt()是否打印出错信息*/
extern int   optind; /*当前getopt()返回选项的下一个选项的索引(argv数组)*/

int main(int argc, char* argv[])
{
    int opt = 0;

    opterr = 0; /*不要打印出错信息*/

    while((opt = getopt(argc, argv, "ab:c::d")) != -1) {
        switch (opt) {
            case 'a': //该选项不需要带参数
                printf("选项:a,下一个选项:%s\n", argv[optind]);
                break;
            case 'b': //该选项必须带参数
                printf("选项:b,带的参数:%s\n", optarg);
                break;
            case 'c': //该选项带的参数可选
                printf("选项:c,带的参数:%s\n", optarg);
                break;
            case 'd': //该选项不需要带参数
                printf("选项:d\n");
                break;
            case '?': //选项列表中没有的,并保存在optopt中
                printf("不知道的选项:%c\n", optopt);
                break;
            default:
                break;
        }
    }
    return 0;
}

运行结果

root@Qt:/home/user/share# ./a.out -acd
选项:a,下一个选项:-acd
选项:c,带的参数:d
root@Qt:/home/user/share# 
root@Qt:/home/user/share# ./a.out -a -bABC -c
选项:a,下一个选项:-bABC
选项:b,带的参数:ABC
选项:c,带的参数:(null)
root@Qt:/home/user/share# 
root@Qt:/home/user/share# ./a.out -c123456 -k
选项:c,带的参数:123456
不知道的选项:k
root@Qt:/home/user/share# ./a.out -a kill -c123456 -k
选项:a,下一个选项:kill
选项:c,带的参数:123456
不知道的选项:k
root@Qt:/home/user/share# 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值