#include<unistd.h>
int getopt(int argc,char *const argv[],const char *optstring);
extern char *optarg;
extern int optind,opterr,optopt;

optstring为一个字符列表,每个字符代表一个单字符选项

全局变量:

optarg:存数据

optind

opterr:控制是否向STDERR打印错误。若值为0,则关闭打印错误信息

optopt:存储出错的option(如缺参数),或者不认识的option

函数说明:

getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数optstring 则代表欲处理的选项字符串。此函数会返回在argv 中下一个的选项字母,此字母会对应参数optstring 中的字母。如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符,如果不希望getopt()印出错信息,则只要将全域变量opterr设为0即可。

短参数定义:

getopt()使用opstring所指的字符串作为短参数列表,像“krf:d::"就是一个短参数列表,短参数的定义是一个‘-’后面跟一个字母或数字(例如命令ls -a -l  getopt()函数接受前面有"-"的参数选项"a,l",当然ls -al也接受为"a,l")

其中短参数在getopt()定义分为下面几种:

1.若optstring中有一个字符后面紧跟一个冒号“:”,则表明该选项有一个关联值作为下一个参数(含f的参数要这样写" -f filename"),若有两个冒号则代表则表示该关联值可有可无(注意:可选关联值的参数与关联值之间不能有空格,例如”-dvalue"是合法的,然而"-d value"是不合法的)

2.不带值得参数也就是说短参数列表中“r‘就不用带关联值,还有不带值的参数可以连写,”k“与“r”就是不带值的参数,在命令中可以写成"-kr" 或者"-k -r"

3.参数顺序不要求先后,例如"-kr -f opt.c -dopt"与"-f opt.c -dopt -kr"是合法的

返回值:

getopt()每次调用会逐次返回命令行传入的参数。

当没有参数的最后的一次调用时,getopt()将返回-1。

当解析到一个不在optstring里面的参数,或者一个必选值参数不带值时,返回'?',对于解析到一个不在optstring里面的参数的情况,函数会报错,输出一个错误信息,如果不想输出错误信息,设置全局变量opterr为0就行或者用下面的方法(opstring开头加个冒号":")

当optstring是以':'开头时,缺值参数也就是参数后面缺少关联值下会返回':',而不是'?' ,当然这不影响遇到解析到一个不在optstring里面的参数的情况,这种情况仍然返回'?',而且函数不会输出错误信息(不知道为什么)

好了,接下来就是测试了,先贴代码

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
int opt;
while((opt=getopt(argc,argv,":krf:d::"))!=-1)
{
switch(opt)
{
case 'k':
case 'r':
printf("Option %c\n",opt);
break;
case 'f':
printf("Option %c with value %s\n",opt,optarg);
break;
case 'd':
if(optarg!=0)
{
printf("Option %c ",opt);
printf(" value %s\n",optarg);
}
else
printf("Option without value %c\n",opt);
break;
case '?':
printf("Unknown option %c\n",optopt);
break;
case ':':
printf("-%c needs value\n",optopt);
break;
}
}
for(;optind<argc;optind++)
{
printf("Argument: %s\n",argv[optind]);
}
return 0;
}

测试语句"./a.out file -kr -ddoc -f a.out -q"

文章参考:http://blog.csdn.net/an_zhenwei/article/details/7947570

http://vopit.blog.51cto.com/2400931/440453

至于optind的内容可以参考http://blog.sina.com.cn/s/blog_64ba2b750100vz5b.html

C语言-getopt函数的更多相关文章

  1. C语言getopt()函数的使用

    getopt(分析命令行参数)     相关函数表头文件         #include<unistd.h>定义函数         int getopt(int argc,char * ...

  2. linux C语言getopt()函数的使用

    getopt被用来解析命令行选项参数. #include <unistd.h> 函数及参数介绍 extern char *optarg; //选项的参数指针,如果选项字符串里的字母后接着冒 ...

  3. 如何写好 C语言 main 函数!你准备好编写 C 程序了吗?

    学习如何构造一个 C 文件并编写一个 C main 函数来成功地处理命令行参数.   我知道,现在孩子们用 Python 和 JavaScript 编写他们的疯狂"应用程序".但是 ...

  4. C语言pow函数编写

    C语言pow函数编写 #include<stdio.h> double chaoba(double f,double q); //声明自定义函数 void main(void) { dou ...

  5. C语言-自定义函数

    C语言自定义函数 --1-- 自定义函数定义 1.1 无参无返回值函数 1.2 无参有返回值函数 1.3 有参无返回值函数 1.4 有参有返回值函数 --2-- 函数的参数 2.1 形式参数介绍和使用 ...

  6. C语言printf()函数:格式化输出函数

    C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为:     int printf( char ...

  7. getopt函数的使用——分析命令行参数

    getopt(分析命令行参数) getopt(分析命令行参数) 短参数的定义 返回值 范例 getopt_long 相关函数表头文件#include<unistd.h> 函数声明int g ...

  8. C语言的函数

    "函数"在英文的翻译是"function",无论在自然科学还是计算机科学都是这个词,而"function"的本意是"功能" ...

  9. c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)

    C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...

随机推荐

  1. ios 网络数据下载和JSON解析

    ios 网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍ios中如何利用NSURLConnection从网络上下载数据,如何解析下载下来的JSON数据格式,以及如何显示数据和图片的异步下载 ...

  2. (转)Source vs Binary Disadvantages & Advantages of each!

    原链接:http://www.linuxforums.org/forum/newbie/26472-source-vs-binary-disadvantages-advantages-each.htm ...

  3. EL表达式在JS中取出来打印[object HTMLDivElement]的问题

    今天做项目的时候,要在JS中获取请求参数中的 值,想直接用 ${param.tabName}获取,结果console.debug()打印出来,居然是  [object HTMLDivElement] ...

  4. MySQL学习笔记(4) - 创建数据库

    1.建立一个简单的数据库 CREATE DATABASE t1: 图中如果未打:号,系统会等待直到用户输入结束符才会之行语句. 2.查看当前服务器下数据库列表 SHOW DATABASES; 必须是D ...

  5. 评论PK投票功能的手机版

    ajax投票.点赞.回复,投票后自动转到查看投票结果,投票结果进度条动画显示 地址:http://files.cnblogs.com/files/macliu/hyw_wap.rar 效果图: 首页:

  6. 读php手册一点点心得(1)

    1.   要输出大段文本时,跳出PHP解析模式通常比将文本通过echo或print输出更有效率(手册) 2.   note :为了代码的发行及一致性,确保不要使用短标记,短标记仅通过php.ini配置 ...

  7. Mysql 配置慢查询日志(SlowQueryLog)以及使用日志分析工具

    [ 查看系统关于慢查询的设置 ] mysql> show variables like '%slow%'; +---------------------------+-------------- ...

  8. Python学习笔记一,输入输出

    输出:用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下>>>print('hello,world') 也可以是多 ...

  9. information_schema.profiling学习

    information_schema.profiling可以用来分析每一条SQL在它执行的各个阶段的用时,注意这个表是session 级的,也就是说如果session1 开启了它:session2没有 ...

  10. window7下statsvn统计代码量

    下载statsvn:http://www.statsvn.org/ 将下载后的statsvn.jar放到d:\svn目录下; 打开cmd窗口切换到需要统计代码的项目目录如:d:\project\web ...