您的位置:首页 > 运维架构

getopt 函数功能的实现

2013-07-22 21:30 162 查看
最近写个ls命令功能的东西,不过本人比较菜鸟目前只完成 -l ,-a,-al. 目前正往-r 发展。

在写的时候,听到了欢哥说的getopt这函数。小小研究了下。发现这东西对与参数的处理是相当的方便。

例如:当你的函数有多种情况的参数时,你是不是还得先用strcmp函数对其进行判断下,而用getopt就方便多了。也许如果只是实现-l -a 以及组合的-al 时还不觉得有多麻烦。但是如果打算实现多种情况的时候就回非常非常的蛋疼了。例如如果打算实现 -l -a -r -s -i 这几种的参数时,不考虑组合的话只是5种,(也不过就5次的判断),当考虑到组合的时候两位组合就有10种,三位的话有10种,四位的话有5种,五位有1种组合。这几种情况实现下来要写多少的判断语句,而调用getopt函数的话就跳过个判断这一环节,直接列出各种情况下要实现的各种功能,下面来介绍一下这个函数。

其头文件在 #inlcude<unistd.h>

函数定义:   int getopt(int argc, char * const argv[], const char *optstring);

前两个参数就是int main(int argc, char **argv);中的这两个参数;第三个参数就是你要对其选项进行将argv里的东西对其进行传递的选项。

而关于getopt第三个形参optstring又有几种规定

1.单个字符:代表选项

2.单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。

3.单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。

每当调用getopt函数时,其成功调用是选项。当命令参数中查找不到与其对应的选项时,则返回 -1。当处理带‘-’的参数时,‘-’后其紧跟着的字符为选项名。

而后就是其参数了。对了,getopt还有几个宏,下面来说说这几个宏的用法与定义。

       extern char *optarg :其为命令参数的指针(不包括‘-_'这块)选项的参数指针,但是当我们对其选项如果没有进行输入参数时,其为空指针NULL。

       extern int optind :当我们每次调用getopt时,optind都会移动。下一次调用getopt的时,从optind存储的位置处重新开始检查选项。 

       extern int opterr: 用于输出错误时用的变量。当opterr=0时,getopt不向stderr输出错误信息。

       extern int optopt:  当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,该选项存储在optopt中,getopt返回'?’、

下面上段测试代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int k;
opterr = 0;
if(k = getopt(argc, argv, "a:b::c"))
{
switch(k)
{
case'a':
printf("the a optopt: %c, optarg = %s\n", optopt,optarg);
break;
case'b':
printf("the b optopt: %c, optarg = %s\n", optopt,optarg);
break;
case'c':
printf("the c optopt:%c, optarg = %s\n", optopt,optarg);
break;
case'?':
printf("不符规定的参数输入 optopt:%c, optarg = %s\n", optopt,optarg);
break;

}

}

return EXIT_SUCCESS;
}
gcc 编译 : gcc test.c -o test
执行 : ./test -a       其结果为:         “不符规定的参数输入 optopt:a, optarg = (null)”

执行 : ./test -a hello   其输出结果为:          “the a optopt: , optarg = hello”

执行 : ./test -c         其输出结果为 :      “the c optopt:, optarg = (null)”

输出结果与意料相同。

推荐使用次函数用于处理外部输入的参数,方便而且高效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C