欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

getopt()函数解析命令行选项参数

程序员文章站 2022-07-07 11:19:49
...
#include <unistd.h>
    
    extern char *optarg;//当前选项的参数指针
    extern int optind;//下次再次调用getopt时,从optind存储的位置重新可是检查选项
    
    extern int opterr;//当opterr = 0时,getopt不向stderr输出错误信息.
    extern int optopt;//当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,该选项存储在optopt中,getopt返回.

主要是介绍optargoptind

int getopt(int argc,char *const argv[],const char *optstring);

使用以上函数得到文件test.c

/*test.c*/
#include <stdio.h>
#include <unistd.h>

int main(int argc,char **argv)
{
        int ch = 0, i = 0;
        while((ch = getopt(argc,argv,"ab:c:de::"))!=-1)
        {
                printf("----------\n");
                printf("ch = %c\n",ch);
                printf("optind:%d\n",optind);
                printf("optarg=%s\n",optarg);
                printf("----------\n");
        }

        printf("::::::optind = %d\n",optind);
        for(i = 0;i<optind;i++)
        {
                printf("argv[%d] = %s)\n",i,argv[i]);
        }
        printf("////////////////////\n");
        for(i = optind;i<argc;i++)
        {
                printf("argv[%d] = %s)\n",i,argv[i]);
        }
        return 0;
}

“ab:c:de::” b:说明选项-b后有参数,c:说明选项-c后有参数,e::说明-e与参数之间没有空格。

a与d后面既没有:也没有::说明是这两个选项的后面是不应该有参数的。

getopt()函数解析命令行选项参数

当我按照每个选项后都加入参数(这么做当然是错误的)后发现,argv中发生了排序。

那些不应该有参数的选项(例如-a -d)和参数形式错误的参数(例如 -e的参数应该是-eee 但是我中间加入了空格变成了-e ee)以及错误的参数(./test 后的111)后的参数位置都发生了改变。都按照一定的顺序排到了最后.而第一个排到///////////最后的那个坐标while()循环结束后的optind中保存

这样由于用户输入错误导致的选项与参数顺序问题就解决了