博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
getopt函数
阅读量:4035 次
发布时间:2019-05-24

本文共 2184 字,大约阅读时间需要 7 分钟。

getopt介绍

  Linux 下命令行参数主要可以通过main函数的参数来传递。如果我想进行更丰富的命令行参数交互的话,可以使用getopt函数。

默认传递命令行参数int main(int argc ,char * argv[]){}
getopt

  该函数的argc和argv参数通常直接从main()的参数直接传递而来。optstring是选项字母组成的字符串。如果该字串里的任一字符后面有冒号,那么这个选项就要求有选项参数。

  当给定getopt()命令参数的数量 (argc)、指向这些参数的数组 (argv) 和选项字串 (optstring) 后,getopt() 将返回第一个选项,并设置一些全局变量。然后再次调用该函数,它将返回下一个选项,并设置相应的全局变量。如果不再有可识别的选项,将返回 -1,此任务就完成了。

#include 
int getopt(int argc, char * const argv[], const char *optstring);extern char *optarg;extern int optind, opterr, optopt;

  全局变量解释

  1. char *optarg——当前选项的参数字串(如果有)
  2. int optind——argv的当前索引值。当getopt()在while循环中使用时,循环结束后,剩下的字串视为操作数,在argv[optind]至argv[argc-1]中可以找到
  3. int opterr——这个变量非零时,getopt()函数为“无效选项”和“缺少参数选项,并输出其错误信息,所以是一个是否开启错误打印信息的标志
  4. int optopt——当发现无效选项字符之时,getopt()函数或返回’?’字符,或返回’:’字符,并且optopt包含了所发现的无效选项字符
getopt出错处理机制

  不正确的传递参数在所难免,这种错误要么是命令行选项无效,要么是缺少选项参数。正常情况下,getopt()会为这两种情况输出自己的出错信息,并且返回’?’。

  如果我们想自定义出错信息,有俩种做法

  1. 在调用getopt()之前,将opterr设置为0,这样就可以在getopt()函数发现错误的时候强制它不输出任何消息,但是还是会返回一个‘?’
  2. 如果optstring参数的第一个字符是冒号,那么getopt()函数就会保持沉默,并根据错误情况返回不同字符:

    1. “无效选项” —— getopt()返回’?’,并且optopt包含了无效选项字符。
    2. “缺少选项参数” —— getopt()返回 ‘:’ ,optopt包含了无效字符
: 与 ::

  在optstring中,:有特殊含义。起始处 :代表的意义如上面第二点,一般把它放在一个字符后面就代表这个字符选项必须带参数, “g : “代表g选项必须带参数。: : 俩个冒号代表这个参数是可选的。

demo
#include
#include
extern char *optarg;extern int optind, opterr, optopt;int main(int argc ,char * argv[]){ int option; char InValid ; char * opt_arg; while((option = getopt(argc,argv,":ngl:"))!=-1) { switch(option) { case 'n': printf("选项n\n"); break; case 'g': printf("选项g\n"); break; case 'l': opt_arg = optarg; printf("选项l--%s\n",opt_arg); break; case '?': InValid = optopt; printf("非法选项%c",InValid); break; case ':': printf("选项%c缺少参数\n",optopt); break; default: printf("非法解析\n"); } } return 0;}

这里写图片描述

注意点

  值得注意的一点,输入的命令行参数必须是 - 开头的参数,并且带参数的选项应该放最后面输入,比如下面这个列子getopt不会吧g当成选项,它会把 g 当成 l 的参数

./a.out     -nlg
你可能感兴趣的文章
[茶余饭后]10大毕业生必听得歌曲
查看>>
gdb调试命令的三种调试方式和简单命令介绍
查看>>
C++程序员的几种境界
查看>>
VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法
查看>>
VUE-Vue.js之$refs,父组件访问、修改子组件中 的数据
查看>>
Vue-子组件改变父级组件的信息
查看>>
Python自动化之pytest常用插件
查看>>
Python自动化之pytest框架使用详解
查看>>
【正则表达式】以个人的理解帮助大家认识正则表达式
查看>>
性能调优之iostat命令详解
查看>>
性能调优之iftop命令详解
查看>>
非关系型数据库(nosql)介绍
查看>>
移动端自动化测试-Windows-Android-Appium环境搭建
查看>>
Xpath使用方法
查看>>
移动端自动化测试-Mac-IOS-Appium环境搭建
查看>>
Selenium之前世今生
查看>>
Selenium-WebDriverApi接口详解
查看>>
Selenium-ActionChains Api接口详解
查看>>
Selenium-Switch与SelectApi接口详解
查看>>
Selenium-Css Selector使用方法
查看>>