实例讲解getopt()函数的使用

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    extern char *optarg;//保存选项的参数
    extern int optind, opterr, optopt;
    int ch;

    printf("\n\n");
    printf("otperr:%d\n", opterr);//是否将错误信息输出到stderr,为0时表示不输出
    printf("optind:%d\n", optind);//记录下一个检索位置
    printf(">>>>>>>>>>>>>>>>>>>>>\n");
    opterr = 1;
    while ((ch = getopt(argc, argv, "a:b::cde")) != -1) {//当a没有传入参数时,会执行case '?':
	//while ((ch = getopt(argc, argv, ":a:b::cde")) != -1) {//当a没有传入参数时,会执行case ':':
        printf("optind:%d\n", optind);
        printf("optarg:%s\n", optarg);
        printf("ch:%c\n", ch);
        switch (ch) {
        case 'a':
            printf("option a: '%s'\n", optarg);
            break;
        case 'b':
            printf("option b: '%s'\n", optarg);
            break;
        case 'c':
            printf("option c\n");
            break;
        case 'd':
            printf("option d\n");
            break;
        case 'e':
            printf("option e\n");
            break;
        case ':':
            printf("option lost...\n");
            break;
        case '?':
            printf("unknow option :%c\n", ch);
        }
    }
    printf("optopt +%c\n", optopt);//不在选项字符串optstring中的选项。找不到参数的case '?'和缺少选项的case ':'的选项
}


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

optarg:选项的参数指针

optind:记录下一个检索位置,在getopt的执行中,每次进入都会更新optind变量,该变量指向下一个argv参数

opterr:是否将错误信息输出到stderr,为0时表示不输出

optopt:当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,该选项存储在optopt中,getopt返回'?’

optstring说明:

"a:b::cde",这就是一个选项字符串。对应到命令行就是-a ,-b ,-c ,-d, -e 。冒号又是什么呢? 冒号表示参数,一个冒号就表示这个选项后面必须带有参数,如果optstring中指定了option需要参数,但在命令行没有参数,那么getopt将返回'?',如果在optstring的第一个字符(或者在第一个字符是+/-之后)是':',那么将返回':',这个参数可以和选项连在一起写,也可以用空格隔开,比如-a123 和-a   123(中间有空格) 都表示123是-a的参数;两个冒号的就表示这个选项的参数是可选的,即可以有参数,也可以没有参数,若有参数,optarg指向该该参数,否则optarg为NULL,但要注意有参数时,参数与选项之间不能有空格(有空格会报错),这一点和一个冒号时是有区别的。


传入的'-'开始的字符被解析为选项,getopt一次执行解析出一个option,如果循环执行,可以将argv中的全部option解析出来,如getopt返回-1,表示argv[]中的所有选项被解析出。

你可能感兴趣的:(C语言)