getopt函数和getopt_long函数


预备知识:

1.getopt()
getopt在UNIX下的命令列程式特别好用,特别是在你有许多参数要加入时。
表头文件:#i nclude <unistd.h>
函数声明:int getopt(int argc, char * const argv[], const char *optstring);
函数说明:getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数optstring 则代表欲处理的选项字符串。此函数会返回在argv 中下一个的选项字母,此字母会对应参数optstring 中的字母。如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符,如果不希望getopt()印出错 信息,则只要将全域变量opterr设为0即可。
返回值:如果找到符合的参数则返回此参数字母,如果参数不包含在参数optstring 的选项字母则返回“?”字符,分析结束则返回-1。

2.getopt_long()                                       

分析命令行选项是一件繁琐的工作。幸运的是GNU C库提供了一个函数使你在处理这项工作时能简单一点。这个函数是getopt_long,它能理解长短两种选项。

要使用getopt_long,你必须提供两个数据结构。头一个是包含有效短选项的字符串,每个选项一个字符。需要参数的选项后面放一个冒号。比如我们的程序,这个字符串为ho:v,表示有效选项是-h,-o与-v并且第二个参数-o后面需要一个参数。


要 指定可用的长选项,你要构建一个option结构的数组。每个元素对应一个长选项,并有四个域。一般情况下,第一个域是长选项的名字(一个字符串,不包含 两个连字符),第二个域如果是1表示这个选项接受一个参数,如果为0表示没有参数。第三个是NULL,第四个是一个字符常量指出与这个长选项对应的短选 项。最后的数组元素全部域应该都为0.

调用getopt_long时,向它传递main的参数argc,argv,描述短选项的字符串与描述长选项的option结构数组。


*每调用getopt_long一次,它分析一个选项,返回这个选项的短选项字母,如果没有发现选项则返回-1.


*典型情况下,我们在一个循环中调用getopt_long,来处理所有用户指定的选项,并通过一个switch语句来处理特别的选项。


*如果getopt_long遇到一个无效选项,它将打印一个错误信息并返回字符'?'。大多数程序将因此退出,并显示用法提示。


*在处理需要参数的选项时,全局变量optarg指向这个参数正文。


*当getopt_long完全全部选项分析时,全局变量optind包含第一个非选项参数在argv中的索引。



程序清单1(getopt函数):

编译运行程序及输出结果如下:
obe-240 eagle/test> gcc -o getopt getopt.c
obe-240 eagle/test> ./getopt
Usage:./getopt [-a value][-b value][-c value][-d] arglist...
obe-240 eagle/test> ./getopt -a hello
a option:hello
obe-240 eagle/test> ./getopt -b world
b option:world
obe-240 eagle/test> ./getopt -c eagle
c option:eagle
obe-240 eagle/test> ./getopt -d
d option:(null)
obe-240 eagle/test> ./getopt first seconde -a helloworld           #Attention!#
a option:helloworld
obe-240 eagle/test> ./getopt -e
./getopt: invalid option -- e
illegal option:(null)


程序清单(getopt_long函数):

 

 

编译并运行程序:

longmenyu@longmenyu-Vostro-1088:~/code$ gcc -o getopt_long getopt_long.c

longmenyu@longmenyu-Vostro-1088:~/code$ ./getopt_long -h

Usage:./getopt_long options [inputfile...]

-h --help:            Display this usage information.

-o --output filename: Write output to file.

 -v --verbose:         Print verbose message.

longmenyu@longmenyu-Vostro-1088:~/code$ ./getopt_long -o

./getopt_long: option requires an argument -- 'o'

Usage:./getopt_long options [inputfile...]

-h --help:            Display this usage information.

-o --output filename: Write output to file.

 -v --verbose:         Print verbose message.

longmenyu@longmenyu-Vostro-1088:~/code$ ./getopt_long -v hello world eagle

Argument[2]:hello

Argument[3]:world

Argument[4]:eagle


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值