命令行参数分析

int getopt(int argc,char const **argv, const char *optstring);
int getopt_long(int argc,char const **argc, const char *optstring, const struct option *longopts,int *longindex);
int getopt_long_only(int argc,char const **argc, const char *optstring, const struct option *longopts,int *longindex);

extern char *optarg;
extern int optind;
extern int optopt;
extern int opterr;

选项串optstring可以包含下列元素:

1) 单个字符,一个选项字符"x"表示选项"-x"

2) 字符后面接一个冒号,说明后面跟随一个选项参数,选项字符"x:"表示选项和其参数"-x argument"。一个跟随的参数argument是否用空格引导与getopt()无关。

3) 字符后面接两个冒号,说明后面可能跟随一个选项参数,选项字符"x::"表示选项和其参数, " -x [argument]"

4) 如果getopt()函数遇到一个在optstring中没有的字符或检测到一个缺选项的参数,它会向stderr中写一个错误信息并返回'?'。将 opterr0可以使它不向stderr中写错误信息。如果optstring':'开头,那么一个缺选项的参数会使':'返回。选项":x"

4) 当参数列已经到尾时getopt()函数返回-1,或者返回'?'当遇到一个未知的选项。参数列中选项的解释可能会被'—'取消,由于它引起getopt()给参数处理发送结束信号并返回-1

5) getopt()的返回中,optarg指向选项参数,变量optind包含下一个argv参数作为对getopt()下一次调用的索引。变量optopt保存最后一个由getopt()返回的已知的选项

6) 首字符是+,选项字符"+x"表示遇到非选项立即结束。

7) 首字符是-,选项字符"-x"表示每个选项都处理


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

int main(int argc,char **argv)
{
    int ch;
    opterr = 0;

    while((ch = getopt(argc,argv,”a:bcd”)) != -1)
        switch(ch)
        {
        case ‘a’:
            printf(“option a:’%s’/n”,optarg);
            break;
        case ‘b’:
            printf(“option b :b/n”);
            break;
        default:
            printf(“other option :%c/n”,ch);
        }

    printf(“optopt +%c/n”,optopt);
}

$./getopt –b
option b:b
$./getopt –c
other option:c
$./getopt –a
other option
$./getopt –a12345
option a:’12345’


unistd里有个 optind变量,每次 getopt后,这个索引指向 argv里当前分析的字符串的下一个索引,因此 argv[optind]就能得到下个字符串,通过判断是否以 '-'开头就可。

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

int main(int argc, char* argv[])
{
    int tmp = 4;
    while( (tmp = getopt(argc, argv,”;abck”)) != -1 )
    {
        printf(“-%c/t”, tmp);
        int opt = optind ;
        while( opt < argc )
        {
            if ( argv[opt][0] != '-' )
            {
                printf(“%s/t”, argv[opt]);
                opt ++;
            }
            else
            {
                break;
            }
        }
        printf(“/n”);
    }
    getchar();
}


int getopt_long(int argc,char const **argc, const char *optstring, const struct option *longopts,int *longindex);

getopt_longgetopt的扩展.getopt接受的命令行参数只可以是以(-)开头,getopt_long还可以接受(--)开头的参数.一般以(-)开头的参数的标志只有一个字母,而以(--)开头的参数可以是一个字符串../mytest -d print --option1 hello --option2 world选项.
getopt
返回我们指定的参数选项.同时将参数值保存在optarg,如果已经分析完成所有的参数函数返回-1.这个时候optind指出非可选参数的开始位置.
getopt_long
getopt复杂一点,不过用途要比getopt广泛.struct option 指出我们可以接受的附加参数选项.

struct option {
    const char *name;
    int has_arg;
    int *flag;
    int val;
};

name: 指出长选项的名称(如我们的option1)
has_arg:
0时表示没有参数值,当为1的时候表明这个参数选项要接受一个参数值.2时表示参数值可以有也可以没有.
flag:
指出函数的返回值,如果为NULL,那么返回val;否则返回0.并将longindex赋值为选项所在数组(longopts)的位置.
val:
返回值或赋值给flag指向的变量

longindex:如果不为NULL, 指向一变量,表示 longopts中一个索引


#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

int main (int argc, char **argv)
{
    int c;
    while (1)
    {
        struct option long_options[] =
        {
            {"add", 1, 0, 0},
            {"append", 0, 0, 0},
            {"delete", 1, 0, 0},
            /*
返回字符c,等同于 -c 选项 */
            {"create", 0, 0, 'c'},
            {"file", 1, 0, 0},
            /*
数组结束 */
            {0, 0, 0, 0}
        };


        /* getopt_long stores the option index here. */
        int option_index = 0;

        c = getopt_long (argc, argv, "abc:d:", long_options, &option_index);

        /* Detect the end of the options. */
        if (c == -1)
            break;

        switch (c)
        {
        case 0:
            printf ("option %s", long_options[option_index].name);
            if (optarg)
                printf (" with arg %s/n", optarg);
            break;
        case 'a':
            puts ("option -a/n");
            break;
        case 'b':
            puts ("option -b/n");
            break;
        /*
可能是-c --creat参数指出来的 */
        case 'c':
            printf ("option -c with value `%s'/n", optarg);
            break;
        case 'd':
            printf ("option -d with value `%s'/n", optarg);
        break;
    }
   }
    exit (0);
}


int getopt_long_long(int argc,char const **argc, const char *optstring, const struct option *longopts,int *longindex);

getopt_long类似 ,-也能指示一个长选项
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值