C语言的getopt
By francis_hao Jul 5,2017
getopt:分析命令行选项
概述
|
#include <unistd.h> |
描述
getopt()函数分析命令行参数,它的参数argc和argv就是程序传递给main()函数的参数,一个以'-'(不是仅有一个'-'或"--")开头的argv元素就是一个选项。'-'后面跟着的就是选项字符,调用多次getopt()函数会连续返回选项字符
变量optind是下一个要处理的元素在argv中的索引,系统初始化该变量为1,调用者可以给它复位为1,以重新扫描argv或扫描一个新的参数向量。
如果getopt()找到一个选项字符,它返回该字符,更新外部变量optind和静态变量nextchar,因此下一次调用getopt()函数时可以继续扫描剩余的选项。如果已经没有更多的选项字符了,getopt()则返回-1,然后,optind变为argv第一个不是选项元素的索引。
optstring是输入参数,它是一个包含需要进行处理的选项字符的集合,如果字符后面跟着一个冒号,表示该选项需要一个参数,因此getopt()将放置一个指向选项后面参数的指针给optarg,注意,形如-t 1和-t1都是可以的,都会将"1"传给optarg。两个冒号说明选项参数是可选的。
默认情况下,getopt()会排列它扫描到的argv中的内容,因此最终,所有不是选项的项会排在最后,另外实现的两种模式:
1、如果optstring的第一个字符是'+',或者环境变量POSIXLY_CORRECT置位,那么getopt()遇到非选项参数即停止,
2、如果optstring的第一个字符是'-',那么每个不是选项的参数,都被当作选项为1的参数处理
命令行中一个特殊的参数"--",当getopt()遇到它时,会强制参数扫描结束。
如果getopt()没有识别选项字符,它会打印一个错误信息到标准错误,存放这个字符到optopt并返回'?'。调用程序可以通过将opterr置0来防止产生错误信息的打印。
关于长选项参见man getopt_long。
示例
本示例为man手册上的例子,添加了一些打印以验证部分描述中的说明。
|
#include <unistd.h> int main(int argc, nsecs = printf("---at the end,list argv value---\n"); printf("flags=%d; nsecs=%d\n", flags, nsecs); if /* Other code omitted */ exit(EXIT_SUCCESS); |
一个执行实例:

做以下说明:
- optind会指向下一次getopt()函数要处理的argv的索引,最终会指向第一个不是选项的参数的argv中的索引(例中的"name")。
- argv中的参数会被重新排序,不是选项的参数会排在选项参数之后。
- 需要参数的选项,这两种形式是一样的:-t1和-t 1。
程序源码在github上,可以直接clone编译。

本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:http://www.cnblogs.com/yinghao1991/p/7123622.html
参考
【1】 man 3 getopt
C语言的getopt的更多相关文章
- 命令行选项解析函数(C语言):getopt()和getopt_long()
命令行选项解析函数(C语言):getopt()和getopt_long() 上午在看源码项目webbench时,刚开始就被一个似乎挺陌生函数getopt_long()给卡住了,说实话这函数没怎么见过, ...
- C语言getopt()函数的使用
getopt(分析命令行参数) 相关函数表头文件 #include<unistd.h>定义函数 int getopt(int argc,char * ...
- linux C语言getopt()函数的使用
getopt被用来解析命令行选项参数. #include <unistd.h> 函数及参数介绍 extern char *optarg; //选项的参数指针,如果选项字符串里的字母后接着冒 ...
- C语言-getopt函数
#include<unistd.h> int getopt(int argc,char *const argv[],const char *optstring); extern char ...
- C语言命令行解析函数:getopt/getopt_long
命令行工具下的参数选项有两种,长选项和短选项.短选项以-开头,后面跟单个字母:长选项以--开头,后面可跟多个字母. 一. getopt() 1.功能:解析命令行短选项参数 2.函数原型: #inclu ...
- c语言基础之getopt()
getopt() #include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); ...
- C语言查缺补漏
7.用ucontext实现简单的用户空间协作多线程 转 http://blog.chinaunix.net/uid-26000137-id-3973004.html http://blog.csdn. ...
- 软件工程线上课程(C语言实践篇)学习心得总结
林牧 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程http://mooc.study.163.com/course/USTC-1000002006 软件工程的理 ...
- [转]Python 命令行参数和getopt模块详解
FROM : http://www.tuicool.com/articles/jaqQvq 有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,在Pyt ...
随机推荐
- scala成长之路(3)隐式转换
不废话,先上例子:定义一个参数类型为String的函数: scala> def sayHello(name:String) = println("hello " + name ...
- Ubuntu设置代理服务器
由于公司网络的原因,apache的网站访问不了,对于需要经常访问apache网站查看文档的我,最近想了一种方法,在自己的阿里云服务器上搭建一个代理服务器.经过查资料,最终决定使用TinyProxy. ...
- python 装饰器 (多个装饰器装饰一个函数---装饰器前套一个函数)
#带参数的装饰器 #500个函数 # import time # FLAGE = False # def timmer_out(flag): # def timmer(func): # def inn ...
- Leecode刷题之旅-C语言/python-9.回文数
/* * @lc app=leetcode.cn id=9 lang=c * * [9] 回文数 * * https://leetcode-cn.com/problems/palindrome-num ...
- Go web表单
package main import ( "fmt" "html/template" "log" "net/http" ...
- 实现一个带有指纹加密功能的笔记本(Android)第一部分
自己经常会忘记一些密码什么的,想把这些密码保存下来,但是别人做的软件总有一点不安全的感觉,所以自己动手做了一个带有指纹加密的笔记本. 以下是本工程用到的一些第三方包 compile 'org.gree ...
- 一种简单实用的双向电平转换电路3.3V-5V
当你使用3.3V的单片机的时候,电平转换就在所难免了,经常会遇到3.3转5V或者5V转3.3V的情况,这里介绍一个简单的电路,他可以实现两个电平的相互转换(注意是相互哦,双向的,不是单向的!).电路十 ...
- SPOJ SUBLEX
SUBLEX - Lexicographical Substring Search 链接 题意 求第k小的子串.相同的算一个. 分析 建立后缀自动机,在后缀自动机上从一个点经过trans,到另一个点, ...
- PRO*C 函数事例 1 -- 数据库连接、事务处理
1.程序结构 每一个Pro*C程序都包括两部分:(1)应用程序首部:(2)应用程序体 应用程序首部定义了ORACLE数据库的有关变量, 为在C语言中操纵ORACLE数据库做 ...
- 怎样安装Python3
在浏览器地址栏输入https://www.python.org/ 打开Python官网 好了,安装完成了! 可以把安装路径C:\Users\Administrator\AppData\Local\Pr ...