getopt()
来源:互联网 发布:移动数据闲时流量包 编辑:程序博客网 时间:2024/05/16 23:36
getopt()
参数、变量说明
#include <unistd.h>int getopt(int argc, char * const argv[], const char *optstring);extern char *optarg;extern int optind, opterr, optopt;argc, argv: 跟 main() 一直
optstring: 接受的选项即选项类别(见下文)。
optarg: 如果选项带参数,则 optarg 指向参数字符串,如 -axxx, 如果 a 是可以接受参数的选项(见下文),则 optarg 指向字符串 "xxx".
optind: option index. The variable optind is the index of the next element to be processed in argv. The system initializes this value to 1. The caller can reset it to 1 to restart scanning of the same argv, or when scanning a new argument vector.
opterr: flag, 如果设置 opterr=0, 则不输出错误。
optopt: 遇到 optstring 中不存在的选项就保存在 optopt 中。
optstring 规则说明
"1abc:d:2::"
1,a,b: 只有选项,无选项参数
c,d: 必须要选项参数(选项和选项参数之间可以有空格)
2: 选项参数可选(可选选项如果选项和选项参数之间有空格,则被视为无选项参数)
返回值
If an option was successfully found, then getopt() returns the option character.
If all command-line options have been parsed, then getopt() returns -1.
If getopt() encounters an option character that was not in optstring, then '?' is returned.
If getopt() encounters an option with a missing argument, then the return value depends on the first character in optstring:
if it is ':', then ':' is returned; otherwise '?' is returned.
#include <unistd.h>#include <iostream>using namespace std;#define OPTSTR "1abc:d:2::"int main(int argc, char *argv[]){ opterr = 0; int iRet = 0; int count = 0; cout << "optstring: " << OPTSTR << endl; cout << "BEGIN: optind=" << optind << endl; while ( (iRet = getopt(argc, argv, OPTSTR)) != -1 ) { switch (iRet) { case '1': cout << "-" << (char)iRet << ", value=" << (optarg ? optarg : "(no value)") << ", optind=" << optind << ", argv[optind-1]=" << argv[optind - 1] << endl; break; case 'a': cout << "-" << (char)iRet << ", value=" << (optarg ? optarg : "(no value)") << ", optind=" << optind << ", argv[optind-1]=" << argv[optind - 1] << endl; break; case 'b': cout << "-" << (char)iRet << ", value=" << (optarg ? optarg : "(no value)") << ", optind=" << optind << ", argv[optind-1]=" << argv[optind - 1] << endl; break; case 'c': cout << "-" << (char)iRet << ", value=" << (optarg ? optarg : "(no value)") << ", optind=" << optind << ", argv[optind-1]=" << argv[optind - 1] << endl; break; case 'd': cout << "-" << (char)iRet << ", value=" << (optarg ? optarg : "(no value)") << ", optind=" << optind << ", argv[optind-1]=" << argv[optind - 1] << endl; break; case '2': cout << "-" << (char)iRet << ", value=" << (optarg ? optarg : "(no value)") << ", optind=" << optind << ", argv[optind-1]=" << argv[optind - 1] << endl; break; default: // '?' cout << "error: iRet=" << (char)iRet << ", optind=" << optind << ", optopt=" << (char)optopt << endl; break; } ++count; } cout << "count: " << count << endl; return 0;}/*correct:./test -1 -a -b -dvalue -cvalue -2value./test -1 -dvalue -2value./test -1 -dvalue -2./test -1 -a -b -d value -c value -2valuewrong:./test -1value./test -x*/
getopt_long()——既接受短选项,也接受长选项
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
struct option { const char *name; int has_arg; int *flag; int val;};name: 长选项名称
has_arg: 选项类型,是否带参数
Symbolic constant
Numeric value
Meaning
no_argument
0
The option does not take an argument.
required_argument
1
The option requires an argument.
optional_argument
2
The option's argument is optional.
flag, val: 如果 flag 设置为 NULL, 则返回值为 val. 如果 flag 为非 NULL, 则返回值为0, flag 所指向的变量的值被设为 val.
Typically, if flag is not NULL, then val is a true/false value, such as 1 or 0. On the other hand, if flag is NULL, then val is usually a character constant.
如果一个选项既有长格式又有短格式(如 --help 和 -h),将 val 的值设为短格式的值(如 'h')。
int do_all, do_help, do_verbose; /* flag variables */char *myfile;struct option longopts[] = {{ "all", no_argument, & do_all, 1 },{ "file", required_argument, NULL, 'f' },{ "help", no_argument, & do_help, 1 },{ "verbose", no_argument, & do_verbose, 1 },{ 0, 0, 0, 0 }};...while ((c = getopt_long(argc, argv, ":f:", longopts, NULL)) != -1) {switch (c){case 'f':myfile = optarg;break;case 0:/* getopt_long() set a variable, just keep going */break;... Error handling code here}}
更过例子:http://linux.die.net/man/3/getopt_long
http://www.informit.com/articles/article.aspx?p=175771&seqNum=3
- getopt
- getopt
- getopt
- getopt
- getopt
- getopt
- getopt ()
- getopt
- getopt
- getopt
- getopt
- getopt
- getopt
- getopt()
- getopt
- getopt
- getopt()
- getopt
- 装饰者模式-星巴克
- Windows Mobile 6 Professional and Standard Software Development Kits Refresh
- Python中Boolean operator的一些特点
- 最近很累 心情很压抑
- 观察者模式-气象站
- getopt()
- FZU - 2109 Mountain Number
- Linux input子系统分析 输入子系统核心分析
- 复杂的抽象类
- 【Leetcode】Letter Combinations of a Phone Number
- stl queue
- Dijkstra算法,单源最短路径(一个起点到各个点的最短距离)
- oracle中动态、静态注册
- Java_io体系之BufferedInputStream、BufferedOutputStream简介、走进源码及示例——10