getopt、getopt_long命令参数
参数 optstring为选项字符串。如果选项字符串里的字母后接着冒号”:”,则表示还有相关的参数
getopt
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg; //选项的参数指针
extern int optind; //下一次调用getopt的时,从optind存储的位置处重新开始检查选项
extern int opterr; //当opterr=0时,getopt不向stderr输出错误信息
extern int optopt; //当发现无效选项字符之时,getopt()函数或返回'?'字符,或返回':'字符
举例说明:
getopt(argc, argv, “ab:c:de::”);
- 单个字符,表示选项,(如上例中的abcde各为一个选项)
- 单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。(如上例中的b:c:)
- 单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟。如果跟一个参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(如上例中的e::,如果没有跟参数,则optarg = NULL)
执行:
./a.out -a
例子:
char ch;
while((ch = getopt(argc, argv, "a:b")) != -1)
printf("getopt %c %s\n", ch, optarg);
./a.out: invalid option -- 'c' //输入不存在的选项
./a.out: option requires an argument -- 'a' //a 需要有参数
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:长参数名(–name)
has_arg:
no_argument(0)-长参数不带参数
required_argument(1)-长参数必须带参数
optional_argument(2)-长参数后面带的参数是可选
flag:当这个指针为空的时候,函数直接将val的数值从getopt_long的返回值返回出去;当它非空时,val的值会被赋到flag指向的整型数中,而函数返回值为0
val:指定函数找到该选项时的返回值,或者当flag非空时指定flag指向的数据的值
longindex:如果longindex非空,它指向的变量将记录当前找到参数符合longopts里的第几个元素的描述,即是longopts的下标值
strtoul
将nptr字符串转换成无符号的长整型数
unsigned long int strtoul(const char *nptr, char **endptr, int base);
base:从2至36,或0
10-10进制
16-16进制
0-如果第一个字符是’0’,就判断第二字符如果是’x’则用16进制,否则用8进制;第一个字符不是’0’,则用10进制
endptr:若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回