#include<unistd.h>
int getopt(int argc,char *const argv[],const char *optstring);

extern char *optarg;

extern int optind,opterr,optopt;

optstring为一个字符列表,每个字符代表一个单字符选项

全局变量:

optarg:存数据

optind

opterr:控制是否向STDERR打印错误。若值为0,则关闭打印错误信息

optopt:存储出错的option(如缺参数),或者不认识的option

函数说明:

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

短参数定义:

getopt()使用opstring所指的字符串作为短参数列表,像“krf:d::"就是一个短参数列表,短参数的定义是一个‘-’后面跟一个字母或数字(例如命令ls -a -l  getopt()函数接受前面有"-"的参数选项"a,l",当然ls -al也接受为"a,l")

其中短参数在getopt()定义分为下面几种:

1.若optstring中有一个字符后面紧跟一个冒号“:”,则表明该选项有一个关联值作为下一个参数(含f的参数要这样写" -f filename"),若有两个冒号则代表则表示该关联值可有可无(注意:可选关联值的参数与关联值之间不能有空格,例如”-dvalue"是合法的,然而"-d value"是不合法的)

2.不带值得参数也就是说短参数列表中“r‘就不用带关联值,还有不带值的参数可以连写,”k“与“r”就是不带值的参数,在命令中可以写成"-kr" 或者"-k -r"

3.参数顺序不要求先后,例如"-kr -f opt.c -dopt"与"-f opt.c -dopt -kr"是合法的

返回值:

getopt()每次调用会逐次返回命令行传入的参数。

当没有参数的最后的一次调用时,getopt()将返回-1。

当解析到一个不在optstring里面的参数,或者一个必选值参数不带值时,返回'?',对于解析到一个不在optstring里面的参数的情况,函数会报错,输出一个错误信息,如果不想输出错误信息,设置全局变量opterr为0就行或者用下面的方法(opstring开头加个冒号":")

当optstring是以':'开头时,缺值参数也就是参数后面缺少关联值下会返回':',而不是'?' ,当然这不影响遇到解析到一个不在optstring里面的参数的情况,这种情况仍然返回'?',而且函数不会输出错误信息(不知道为什么)

好了,接下来就是测试了,先贴代码

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc,char *argv[])
{int opt;while((opt=getopt(argc,argv,":krf:d::"))!=-1){switch(opt){case 'k':case 'r':printf("Option %c\n",opt);break;case 'f':printf("Option %c with value %s\n",opt,optarg);break;case 'd':if(optarg!=0){printf("Option %c ",opt);printf("   value %s\n",optarg);}elseprintf("Option without value %c\n",opt);break;case '?':printf("Unknown option %c\n",optopt);break;case ':':printf("-%c needs value\n",optopt);break;}}for(;optind<argc;optind++){printf("Argument: %s\n",argv[optind]);}return 0;
}

测试语句"./a.out file -kr -ddoc -f a.out -q"

文章参考:http://blog.csdn.net/an_zhenwei/article/details/7947570

http://vopit.blog.51cto.com/2400931/440453

至于optind的内容可以参考http://blog.sina.com.cn/s/blog_64ba2b750100vz5b.html

转载于:https://www.cnblogs.com/cpointer/p/3697990.html

C语言-getopt函数相关推荐

  1. c语言 getopt函数,C - getopt函数

    c语言-getopt函数 作用:获取解析程序运行时用户输入的外部传参(例如:输入ls时的-a.-l的短参,还有--help.-help长参.) 函数原型 #include int getopt(int ...

  2. getopt函数的使用c语言,C语言getopt函数

    一直都在用这个函数,今天再详细的复习一下 0x01 C语言getopt函数介绍 getopt函数主要用于命令行的参数解析,如果我们想对一个程序输入多个数据,就需要配置参数,而传递的参数那么多,就需要程 ...

  3. C语言getopt()函数

    函数介绍 getopt()是一个C语言的函数,它用于解析命令行选项参数. 它的函数原型是: int getopt (int argc, char * const argv [ ], const cha ...

  4. C语言——getopt函数

    getopt()函数声明: int getopt(int argc, char * const argv[],const char *optstring); 使用getopt()函数要引用头文件uni ...

  5. c语言中getenv的作用,C语言putenv()函数和getenv()函数的使用详解

    C语言putenv()函数和getenv()函数的使用详解 C语言putenv()函数:改变或增加环境变量头文件: #include4 定义函数: int putenv(const char * st ...

  6. Mysql —— C语言链接mysql数据库,命令行形式(getopt()函数),用户、用户组增删改查(用户组表内有用户控制的策略字段)

    函数说明--getopt(): 函数说明 getopt()用来分析命令行参数.参数argc和argv分别代表参数个数和内容,跟main()函数的命令行参数是一样的. optstring中的指定的内容的 ...

  7. C语言之getopt函数

    作用 getopt()用来分析命令行参数.参数argc和argv分别代表参数个数和内容,跟main()函数的命令行参数是一样的. //头文件 #include <unistd.h> //函 ...

  8. c语言flag go to,C 语言getopt与go语言flag获取命令参数

    C语言中的getopt()函数为命令参数的获取提供了很大便利,与golang中的flag功能类似. C语言getopt 下面以ssh中获取主机名/ip和用户名为例来示例如何使用getopt(). in ...

  9. Linux下getopt函数的使用

    getopt为解析命令行参数函数,它是Linux C库函数.使用此函数需要包含系统头文件unistd.h. getopt函数声明如下: int getopt(int argc, char * cons ...

最新文章

  1. pyharm虚拟环境_手把手教你如何在Pycharm中加载和使用虚拟环境
  2. man、info、help
  3. XML 解析错误:XML 或文本声明不在实体的开头位置,有效的解决方法
  4. sqlserver存储过程循环写法
  5. YbtOJ#20066-[NOIP2020模拟赛B组Day4]筹备计划【线段树,树状数组】
  6. WWDC 2013 Session笔记 - iOS7中弹簧式列表的制作
  7. Mariadb升级到mysql_mariadb的版本升级方法
  8. Android实现EditText插入表情、超链接等格式
  9. IT行业未来发展前景如何?
  10. php api 实例maccms,api.php · do do/maccms10 - Gitee.com
  11. 达芬奇密码--buuctf密码学
  12. c语言pow函数原型_c语言中的pow()函数怎么用
  13. 证明题【安于现状还是振翅飞往远方】
  14. 硬件结构框架_北桥_带宽
  15. Python写文件到指定路径以及读取文件内容
  16. 火焰检测 python
  17. 无人驾驶—激光雷达与相机
  18. 阿里要收购陌陌了,可来往该怎么办?
  19. 光学共焦显微技术part 1
  20. 用android后勤报修系统,后勤微信报修系统—易报修

热门文章

  1. python与人工智能编程-最适合人工智能开发的5种编程语言,你知道几种?
  2. 怎么自学python语言-python应用:零基础Python应该怎样学习呢?
  3. python小课骗局-谈谈学风变python小课感想,菜鸟表示真的挺简单
  4. python学不会的表情包-小学生绞尽脑汁也学不会的python(反射)
  5. python游戏编程书籍-《Python游戏编程快速上手》一1.3 如何使用本书
  6. python流程控制-Python | 流程控制
  7. 想学python有什么用-学python日常工作有什么用?
  8. python用途与前景-Python 就业方面的选择与应用分析
  9. python零基础怎么学-零基础如何入门Python
  10. 函数式编程语言python-Python函数式编程