C语言——getopt函数

举报
yd_221104950 发表于 2020/12/03 00:40:23 2020/12/03
【摘要】 getopt()函数声明: int getopt(int argc, char * const argv[],const char *optstring); 1 使用getopt()函数要引用头文件unistd.h。 getopt()函数作用: 解析命令行参数中的选项,选项是以’-'开头的字符。 与getopt相关的重要的全局变量 extern char* ...

getopt()函数声明:

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

  
 
  • 1

使用getopt()函数要引用头文件unistd.h。

getopt()函数作用:

解析命令行参数中的选项,选项是以’-'开头的字符。

与getopt相关的重要的全局变量

extern char* optarg;用来保存选项的参数
extern int optind;用来记录下一个检索位置
extern int opterr;是否将错误信息输出到stderr,设置为0时表示不输出,默认为1
extern int optopt;保存不在optstring中的选项

getopt()函数参数说明:

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

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

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

我们来看一个实例:

#include <unistd.h>
#include <stdio.h>
int main(int argc,char * argv[]){ int i; printf("%s\n","argv原序:"); for(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(i = 0;i <argc;i++){ printf("%s  ",argv[i]); } printf("\n"); return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

编译运行:

~/Desktop/MyC$ gcc test8.c -o test8
~/Desktop/MyC$ ./test8 MMMnnnn -a HHHHH -W newWWWW -b hello -c world -d -eHaha MMMMM
argv原序:
./test8  MMMnnnn  -a  HHHHH  -W  newWWWW  -b  hello  -c  world  -d  -eHaha  MMMMM  
START@optind:1,opterr:1
Having option -a
having option -b,and its argument is hello
having option -c,and its argument is world
Having option -d
having option -e,it is optional,and its argument is Haha
END@optind:9,argv[9]:MMMnnnn
argv现序:
./test8  -a  -W  -b  hello  -c  world  -d  -eHaha  MMMnnnn  HHHHH  newWWWW  MMMMM

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

通过重复调用getopt()就可以一个一个获得命令行参数里的每一个选项字符。optind其实就是option index的缩写,就是指选项在数组argv的索引。

如果扫描不到任何选项字符,getopt()就会返回 -1。此时optind是argv参数数组第一个非选项参数元素的索引。

系统一开始就会将optind初始化为1。如果需要重新扫描argv的元素,可以手动将optind重置为1。
如果getopt()找到了另一个选项字符,就会返回那个字符,将更新变量optind,下次调用getopt()才可以继续扫描下一个选项字符。

注意:有一个特殊的参数 "–"会强制终止选项扫描,而不管扫描模式是什么。

当处理选项列表时,getopt()函数可以发现两类错误:

	 (1) 发现所提供的选项字符不在optstring中的错误。 (2)发现后面要跟参数的选项没有提供参数的错误。

  
 
  • 1
  • 2

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/87898328

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。