C语言 --- getopt()函数的使用简析

Posted Overboom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 --- getopt()函数的使用简析相关的知识,希望对你有一定的参考价值。

1. getopt函数申明

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

使用时需包含头文件 unistd.h
argc、argv:分别来自命令行传给main()函数的参数argc(参数个数)和argv(参数数组)。
optstring:是一个包含合法选项字符的字符串。

2. getopt函数的作用

getopt被用来解析命令行选项参数。也即对optstring中的选项字符的处理:

(1)选项字符后面跟一个冒号“:",则此选项后要带一个参数,可以通过全局变量 optarg来获取 。
(2)选项字符后面跟两个冒号“::“,则此选项的参数是可选的,即如果提供选项参数,则选项参数必须紧跟在选项字符后面,不能以空格隔开,如”o::",则命令行中应该是这样的"-oarg",同样用optarg获取,如果没有提供值,则optarg为0
(3)如果optstring包含“W;",即W后面一个分号,那么当命令行中出现“-W foo”,它们就会被当成是一个长选项,即“–foo”。
(4)如果optstring的第一个字符是冒号’:’,那么getopt() 不会打印错误信息,返回双引号’:’。默认情况下, getopt()会在标准错误中打印错误信息。
(5)如果输入的选项字符不在合法选项字符optstring中,getopt()函数返回“?”,并将错误的字符放在optopt全局变量中。

3. 与getopt相关的全局变量

extern int optind //下一次调用getopt的时,从optind存储的位置处重新开始检查选项。

extern int opterr //当opterr=0时,getopt不向stderr输出错误信息。

extern int optopt //当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,该选项存储在optopt 中,getopt返回’?’

extern char *optarg //选项的参数指针,如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符,如果不希望getopt()印出错信息,则只要将全域变量opterr设为0即可。

4. getopt()对参数处理的三种情况:

  • 默认情况下,getopt()会在扫描时重新排列argv的内容。最终,所有非选项参数都会排在最后面。
  • 如果optstring的第一个字符是 '+'或者设置了环境变量POSIXLY_CORRECT,那么一旦遇到非选项参数,就会停止处理选项(即不会重新排列)。
  • 如optstring 第一个字符是 ‘-’,那么每一个非选项参数都将被处理,好似它们就是选项的参数。(也不会重新排列)

5. code示例

最快的方法还是看一段示例代码。上菜

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

int main(int argc,char * argv[])
{
        printf("%s\\n","argv原序:");
        for(int i = 0;i < argc; i++)
        {
            printf("%s  ",argv[i]);
        }
        printf("\\n");

        printf("START@optind:%d,opterr:%d\\n",optind,opterr);

        int ret;
        while((ret = getopt(argc,argv,"aW;b:c:de::")) != -1){
                switch(ret)
                { 
                case 'a':
                        printf("having option -a\\n");
                        break;
                case 'b':
                        printf("having option -b,and its argument is %s\\n",optarg);
                        break;
                case 'c':
                        printf("having option -c,and its argument is %s\\n",optarg);
                        break;
                case 'd':
                        printf("Having option -d\\n");
                        break;
                case 'e':
                        printf("having option -e,it is optional,and its argument is %s\\n",optarg);
                        break;
                case '?':
                        printf("Unknown option -%c\\n",(char)optopt);
                        break;
                }
       }
        printf("END@optind:%d,argv[%d]:%s\\n",optind,optind,argv[optind]);

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

执行结果:

6. 一个选项传递多个参数

对于5的code示例,只是最基本的用法,有时候一个选项需要传递多个参数,如何实现呢?

#include <stdio.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
	int ch;
    char *s1, *s2, *s3;
	char *s4, *s5;
	
	while((ch = getopt(argc,argv,"a:b:"))!= -1)
	{
		switch(ch)
		{
		case 'a' : 
			s1=optarg;
			s2=argv[optind];
			s3=argv[optind+1];
			break;
		case 'b' :
			s4 = optarg;
			s5 = argv[optind];
			break;
		default: 
			printf("unrecongnized option :%c\\n",ch);
			break;
		}
	printf("s1 = %s, s2 = %s, s3 = %s, s4 = %s, s5 = %s\\n", s1, s2, s3, s4, s5);
	}
	return 0;
}

编译结果:

至于为什么第一次打印的时候,s5是NULL,我还没搞清楚,有知道原因的看到了烦请指教

参看链接:
https://www.cnblogs.com/gjianw217/p/3288051.html
https://blog.csdn.net/weixin_40763897/article/details/87898328
https://blog.csdn.net/zhq651/article/details/8494324

以上是关于C语言 --- getopt()函数的使用简析的主要内容,如果未能解决你的问题,请参考以下文章

Python 命令行参数和getopt模块详解

C命令行参数解析——getoptgetopt_long及getopt_long_only

Osip2和eXosip协议栈的简析

尝试使用getopt解析c中的输入

Linux下getopt()函数的简单使用

Linux下getopt()函数的简单使用