命令行参数解析:getopt,getopt_long
2016-01-19 21:22
453 查看
#include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; /* 当前选项对应的参数,or NULL */ extern int optind, opterr, optopt; /* optind 再次调用getopt()时在argv中的索引; * 遇到无法解析选项时,返回 '?' ,显示错误消息,若不想显示则opterr=0; * optopt 最后一个未知选项的索引; #include <getopt.h> int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); int getopt_long_only(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); Feature Test Macro Requirements for glibc (see feature_test_macros(7)): getopt(): _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE getopt_long(), getopt_long_only(): _GNU_SOURCE
argc,**argv: main函数传递
*optstring: 对于每一个字符选项而言,'c'表示无参数;'c:'表示有参数,形式 "-c Argument"/"-cArgument";'c::'表示参数可有可无,若有形式只能是'-cArgument'。
struct option数组最后的元素全0,*longindex保存当前数组索引。
struct option { const char *name; /* 长选项名字 */ int has_arg; /* 选项是否有参数:no_argument,0;required_argument,1;optional_argument,2 */ int *flag; int val; }; /* *flag,val仅作用于长选项 * flag==NULL时,val; * flag!=NULL时,返回 0,val保存到flag中 */
getopt成功,返回选项字符;解析完毕返回-1;遇到不在optstring中的选项,返回 '?';遇到缺少参数的选项,返回 ':'(若optstring第一个字符为 ':',否则返回 '?'。
getopt_long 短选项,返回对应选项字符;长选项时,返回val(flag==NULL),返回0(flag!=NULL,保存val);其他情况同getopt。
getopt_long例子
#include<string.h> #include<strings.h> #include<stdio.h> #include<stdlib.h> #include<getopt.h> int reload,time; static const struct option long_options[]= { {"force",no_argument,NULL,'f'}, {"reload",no_argument,&reload,2}, {"time",required_argument,NULL,'t'}, {NULL,0,NULL,0} }; int main(int argc, char *argv[]) { int opt=0,options_index=0; while((opt=getopt_long(argc,argv,"frt:?h",long_options,&options_index))!=-1) { switch(opt) { case 'f': printf("case f opt=%c",opt); break; case 'r': printf("case r opt=%c",opt); break; case 't': printf("case t opt=%c",opt); break; case 0: printf("case 0 opt=%c",opt); break; } printf(" optarg=%s\t optind=%d\t opterr=%d\t optopt=%d\t ",optarg,optind,opterr,optopt); printf(" reload=%d,time=%d \n",reload,time); } return 0; }
getopt例子
#include<string.h> #include<strings.h> #include<stdio.h> #include<stdlib.h> #include<getopt.h> #include<unistd.h> int main(int argc, char *argv[]) { int opt; while((opt=getopt(argc,argv,"frt:?h"))!=-1) { switch(opt) { case 'f': printf("case f opt=%c ",opt); break; case 'r': printf("case r opt=%c ",opt); break; case 't': printf("case t opt=%c ",opt); break; } printf("optarg=%s\n",optarg); } return 0; }
相关文章推荐
- nginx服务器配置详解
- 学习c语言遇到的一些问题(5)(Linux)(运算符的优先级)
- FFmpeg avformat_open_input函数打开acc,h264失败的错误问题
- 解析Tomcat内部结构和请求过程
- 脚本(一键)安装zabbix
- 017_查看Hadoop 日志以及日志的格式
- CentOS学习14_CentOS下默认RPM安装路径
- windows和linux下安装树莓派系统及wifi配置
- Linux中php_mbstring加载失败
- CopyOnWriteArrayList
- Linux 2.5.43版本的RCU实现
- 【Apache运维基础(4)】Apache的Rewrite攻略(1)
- OpenGL教程(25) skybox
- OpenGL ES2.0开发经验(一) :
- 11078 Open Credit System
- Linux 中 eclipse 的tomcat端口号被占用
- tomcat在eclipse中debug总进threadpoolexecutor异常
- OPenGL笔录之顶点笔录glVertex*
- 图像处理——alpha融合
- 2013百度校招运维dba笔试+三面,社招一面