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)”
输出结果与意料相同。
推荐使用次函数用于处理外部输入的参数,方便而且高效。
在写的时候,听到了欢哥说的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)”
输出结果与意料相同。
推荐使用次函数用于处理外部输入的参数,方便而且高效。
相关文章推荐
- 4、实现malloc内存分配函数功能一样的代码
- 【C语言】请编写实现以下功能函数:实现对一个8bit数据(unsigned char)的指定位(例如第8位)的置0或置1操作,并保持其他位不变
- 编写程序,实现strlen()相同功能myStrlen()函数
- PHP自定义函数实现数组比较功能示例
- 使用Oracle函数实现按汉字拼音首字母查询功能
- ES6中javascript实现函数绑定及类的事件绑定功能详解
- 在XPO中实现sql中的函数功能
- SQL中实现Split的功能函数
- 编写一个程序实现strcmp函数的功能
- 用函数实现strcat功能
- 编程菜鸟的日记-初学尝试编程-编写函数实现strlen功能(总结考察点)
- 用C语言编写函数,实现strlen计算字符串长度的功能
- 使用JS实现jQuery的addClass, removeClass, hasClass函数功能
- 编写实现strstr()函数功能的代码
- mysql实现over()开窗函数功能
- js实现类似php中strtotime函数和timetostr的日期转换/互换功能
- C#函数实现的小功能
- C#--第四周实验--任务3--定义一个人员类Cperson,在此基础上派生出学生类CStudent和教师类CTeacher,实现输入输出功能的成员函数。
- 用c语言实现一个strcat函数功能相同的函数