#include <unistd.h>
int ret = int getopt(int argc, char * argv[], const char * optstring);
extern char *optarg;
extern int optind, opterr, optopt;
例子
getopt(argc, argv, "nt:")
程序执行时
./a.out -n
合法./a.out -s
不合法./a.out: invalid option -- s./a.out -t不合法./a.out: option requires an argument -- t
./a.out -t 2012合法
1, optstring
nt是选项, 也就是-n -t, t:表示t后面需要加参数。因为没有s,所以如果命令中出现例如-s会提示invalid option. 如果两个冒号,比如t::表示t后面可以接参数也可以不接参数。如果出现了W; 即W接着一个分号,则命令行中-W foo会被当成是--foo
2, optarg
选项t被要求接一个参数,则optarg 存放这个参数,无论参数和t之间是否有空格。比如-t 2012 和 -t2012, optarg中都会有2012。但是需要注意的是如果需要数字2012需要用atoi(optarg)转换成int型
3, optind
第一种情况,返回值不是-1。 optind的值是下一个字符串数组的index,这样做的目的是当再调用一次函数时,他将直接检查下一个argv。因为字符串数组的index是从0开始的,所以上面所有例子中都是2。值得注意的是下面的例子执行结果是不同的
./a.out -t 2012 -s合法,optarg是2012, optind是2./a.out -s -t 2012不合法,提示./a.out: invalid option -- s, optind是2, optarg是空、原因是函数执行的时候先从第0个argv开始检查。碰到不合法的就停止了。
第二种情况,返回值是-1。 optind是参数列表中第一个不是选项的index
4, 返回值ret
当(第一个)参数合法,ret是参数的ascii码
当(第一个)参数不合法,ret是符号?的ascii码,即63
当没有更多的参数可供检查时(while中),返回-1。
5, optopt
当(第一个)参数不合法,optopt是不合法参数的ascii码
6, opterr
不合法时,如果opterr此时又是1,将打印上述的错误如invalid option 和option requires an argument。如果不想打印错误,在函数调用之前,opterr = 0. 默认为1
除非程序只期待一个选项,一般用while结构,因为函数只执行一次参数检查。要想把所有argv都检查一遍,用
while ((opt = getopt(argc, argv, "nt:")) != -1) {
}
本文详细介绍了getopt函数在命令行解析中的使用方法,包括optstring参数的作用、optarg变量的使用、optind和opterr的作用以及它们在不同场景下的表现。通过实例展示了如何正确处理命令行参数,以及在遇到无效选项或参数时的错误处理机制。
135

被折叠的 条评论
为什么被折叠?



