getopt_long

分析命令行参数 , 同时支持短选项和长选项

表头文件

#include <getopt.h>

函数原型

int getopt_long (int argc, char **argv, const char *shortopts,
const struct option *longopts, int *longind)

函数说明

参数 char *shortopts : 定义短选项,如果有必选参数就要在选项名后加冒号,无参数或可选参数则不要, 短选项的用法是一个-后面跟选项名,如果有参数空格加参数,例如 ./myserver -c cfg.json 如果是可选参数则要使用两个-,并用等号赋值,例如:./myserver –v=5

参数 const struct option *longopts: 定义长选项的数组, 每一个选项是一个struct option的结构体

struct option {
          const char *name;        // 长选项名称
          int has_arg;                // 参数使用情况
          int *flag;                    // 将参数值赋值的变量
          int val;                    // 选项对应的整数值, 这里长选项的整数值可以填入短选项的字符,这样长短选项可以关联起来,达到相同的效果。如果长选项没有对应可用的短选项,则这儿要定义一个数值,这个数值最好大于256,避免和短选项值冲突。
};

has_arg 参数可以是:

  • no_argument (or 0)
    没有参数,那么在选项之后就不能写参数,如果用等号加参数就会报错。 option ‘–help’ doesn’t allow an argument,如果空格加参数,那参数会被认为是一个选项
  • required_argument (or 1)
    必须参数,在命令行中需要跟在选项名后面用空格分开,例如 ./myserver –port 8000 或者用等号连接 ./myserver –port=8000
  • optional_argument (or 2)
    可选参数,只能使用等号添加。例如 ./myserver –verbose=5

返回值

如果找到符合的参数则返回此参数,如果参数不包含在参数optstring 的选项字母则返回“?”字符,分析结束则返回-1。

范例

#include <stdio.h>
#include <getopt.h>

static char *short_opts = "h:u:p:";
static struct option long_options[] = {
    {"host", optional_argument, NULL, 'h'},
    {"user", required_argument, NULL, 'u'},
    {"password", required_argument, NULL, 'p'},
    {"help", no_argument, NULL, '?'},
    {NULL, 0, NULL, 0}
};

static void printHelp(char *);

int main(int argc, char *argv[]) {
    char *host = "127.0.0.1";
    char *user = "root";
    char *password = "";

    int opt = 0;
    while((opt = getopt_long(argc, argv, short_opts, long_options, NULL)) != -1){
        switch (opt) {
            case '?':  // 如果不能识别的选项,则打印帮助
                printHelp(argv[0]);
                return 0;
            case 'h':
                host = optarg;
                break;
            case 'u':
                user = optarg;
                break;
            case 'p':
                password = optarg;
                break;
        }
    }
    printf("host=%s, username=%s, password=%s\n",host,user,password);
    return 0;
}

void printHelp(char *prog) {
    printf("%s usage.\n", prog);
    printf("eg:\n");
    printf("%s -h localhost -u root -p 123456789\n", prog);
    printf("-h: hostname or ipaddress, default: localhost\n");
    printf("-u: user, default: root\n");
    printf("-p: port number, default: 3306\n");
}

执行

$ ./getoptlong -h
getoptlong: option requires an argument -- h
./getoptlong usage.
eg:
./getoptlong -h localhost -u root -p 123456789
-h: hostname or ipaddress, default: localhost
-u: user, default: root
-p: port number, default: 3306

$ ./getoptlong --host=192.168.0.3
host=192.168.0.3, username=root, password=
文档更新时间: 2021-03-07 21:30   作者:周国强