Linux选项解释-getopt和getopt_long函数
来源:互联网 发布:初级会计培训网络课程 编辑:程序博客网 时间:2024/05/17 04:09
Linux选项解释-getopt和getopt_long函数
一、命令行简介
解释分析命令行通常是所以程序的第一个任务,C语言通过argc和argv参数来访问它的命令行参数。
最简单的命令行处理技术可以通过if判断来表示,如下例:
if(argc>1 &&argv[1][0] == ‘-‘ &&argv[1][1] == ‘h’) //判断命令行参数是否为-n
{
do_something();
}
这样处理简单有序的命令行还可以,对于复杂的命令行处理显得有心无力,于是GNU提供两个函数专门用来处理命令行参数:getopt和getopt_long。
二、getopt函数
getopt()函数声明如下:
- #include <unistd.h>
- Int getopt(int argc, char *const argv[], const char *optstring);
- extern char *optarg;
- extern int optind, opterr, optopt;
说明:函数中的argc和argv通常直接从main()到两个参数传递而来。optsting是选项参数组成的字符串,如果该字符串里任一字母后有冒号,那么这个选项就要求有参数,optarg就是选项参数。optind是当前索引,optopt用于当发现无效选项字符的时候,getopt函数或者返回“?”或者返回“:”字符,并且optopt包含了所发现的无效选项字符。
如果optstring参数的第一个字符是冒号,那么getopt会根据错误情况返回不同的字符,当错误是无效选项,getopt返回“?”,当错误是缺少选项参数,getopt返回“:”。
注:GNU getopt()第三个特点是optstring中的选项字符后面接两个冒号,就允许该选项有可选的选项参数。在选项参数不存在的情况下,GNU getopt()返回选项字符并将optarg设置为NULL。
例子:
- #include <stdio.h>
- #include <unistd.h>
- #include <getopt.h>
- char *para = ":ab:c";
- int main(int argc, char *argv[])
- {
- int oc = -1;
- char *b_input = NULL;
- while((oc = getopt(argc, argv, para)) != -1)
- {
- switch(oc)
- {
- case 'a':
- printf("input para is a/n");
- break;
- case 'b':
- b_input = optarg;
- printf("input para is b,and optarg is %s/n", b_input);
- break;
- case 'c':
- printf("input para is c/n");
- break;
- case ':':
- printf("option %c requires an argument/n",optopt);
- break;
- case '?':
- default:
- printf("option %c is invalid:ignored/n",optopt);
- break;
- }
- }
- return 0;
- }
编译:
[root@heguangwu projects]# gcc -o getopt_ex getopt_ex.c
运行:
[root@heguangwu projects]# ./getopt_ex -a
input para is a
[root@heguangwu projects]# ./getopt_ex -a -b
input para is a
option b requires an argument
[root@heguangwu projects]# ./getopt_ex -d
option d is invalid:ignored
三、getopt_long函数
getopt_long用来处理长选项,使用man 3 getopt_long,得到其声明如下:
- #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);
前三个参数与getopt相同,下一个参数是指向数组的指针,这个数组是option结构数组,option结构称为长选项表,其声明如下:
- struct option
- {
- const char *name;
- int has_arg;
- int *flag;
- int val;
- };
结构中的元素解释如下:
const char *name:选项名,前面没有短横线
int has_arg:描述长选项是否有参数,其值见下表
符号常量
数值
含义
no_argument
required_argument
optional_argument
0
1
2
选项没有参数
选项需要参数
选项参数是可选的
int *flag:
如果该指针为NULL,那么getopt_long返回val字段的值;
如果该指针不为NULL,那么会使得它所指向的结构填入val字段的值,同时getopt_long返回0
int val:
如果flag是NULL,那么val通常是个字符常量,如果短选项和长选项一致,那么该字符就应该与optstring中出现的这个选项的参数相同;
- #include <stdio.h>
- #include <unistd.h>
- #include <getopt.h>
- char *para = ":ab:cf:v";
- int do_all = 0;
- int do_help = 0;
- int do_version = 0;
- char *file = NULL;
- struct option longopt[] =
- {
- {"all", no_argument, &do_all, 1},
- {"file", required_argument, NULL, 'f'},
- {"help", no_argument, &do_help, 1},
- {"version", no_argument, &do_version, 1},
- {"bob", required_argument, NULL, 'b'},
- {0, 0, 0, 0},
- };
- int main(int argc, char *argv[])
- {
- int oc = -1;
- char *b_input = NULL;
- while((oc = getopt_long(argc, argv, para, longopt, NULL)) != -1)
- {
- switch(oc)
- {
- case 'a':
- printf("input para is a/n");
- break;
- case 'b':
- b_input = optarg;
- printf("input para is b,and optarg is %s/n", b_input);
- break;
- case 'c':
- printf("input para is c/n");
- break;
- case 'v':
- printf("input para is v/n");
- break;
- case 'f':
- printf("input para is f/n");
- file = "hello world";
- break;
- case 0:
- break;
- case ':':
- printf("option %c requires an argument/n",optopt);
- break;
- case '?':
- default:
- printf("option %c is invalid:ignored/n",optopt);
- break;
- }
- }
- printf("do_all is %d/n",do_all);
- printf("do_help is %d/n",do_help);
- printf("do_version is %d/n",do_version);
- printf("do_file is %s/n",file);
- printf("bob is %s/n", b_input);
- return 0;
- }
执行的结果:只显示关键结果
[root@heguangwu projects]# ./opt_ex2 -a
input para is a
[root@heguangwu projects]# ./opt_ex2 --all
do_all is 1
[root@heguangwu projects]# ./opt_ex2 -f h
input para is f
do_file is hello world
[root@heguangwu projects]# ./opt_ex2 --bob aa
input para is b,and optarg is aa
bob is aa
[root@heguangwu projects]# ./opt_ex2 -b aa
input para is b,and optarg is aa
- Linux选项解释-getopt和getopt_long函数
- Linux选项解释-getopt和getopt_long函数
- linux选项解释-getopt和getopt_long函数
- Linux编程系列(1)—— Linux选项解释-getopt和getopt_long函数
- Linux getopt和getopt_long函数
- Linux选项-getopt/getopt_long
- 选项解析:getopt() 和 getopt_long()函数
- 选项解析函数getopt()和getopt_long()
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- [转][VC/MFC]VC资源分配、释放表
- libpcap主要接口函数
- asp存储过程使用
- 生成随机中文汉字验证码
- 如何转sqlserver2005为sqlserver2000数据库
- Linux选项解释-getopt和getopt_long函数
- ffmpeg+sdl教程----编写一个简单的播放器2(输出视频到屏幕)
- VTP
- 图片循环
- 黄光裕陈晓 谁是国美“杀手”?
- 用户是首录过
- 正则表达式验证代码(字母、数字、Email、网址、电话号码、汉字、身份证号码)
- MFC 微软基础类
- ATPCS标准概述