getopt_long学习记录

getopt 函数是用于解析命令行选项和参数的函数。可以非常方便的在运行程序时添加命令行选项。本篇博客主要介绍getopt_long,它扩展了 getopt 函数的功能,支持长选项(例如以 - - 开头的选项),使用getopt_long 需要包含头文件:

#include <getopt.h>

函数定义:

int getopt_long(int argc, char *const argv[], const char *optstring,
                const struct option *long_options, int *option_index);

optstring:一个包含有效短选项字符的字符串,用于指定程序可以接受的短选项及其是否需要参数。与 getopt 中的 optstring 类似。
long_options:一个指向 struct option 数组的指针,用于定义长选项。

option 结构体定义:

struct option
{
  const char *name;
  /* has_arg can't be an enum because some compilers complain about
     type mismatches in all the code that assumes it is an int.  */
  int has_arg;
  int *flag;
  int val;
};

name:长选项的名称(例如 “help”)。
has_arg:指定选项是否需要参数:no_argument,required_argument 或者optional_argument
flag:如果非NULL,则当选项被解析时,*flag 被设置为 val,并且 getopt_long 返回 0。
val:如果 flag 为 NULL,则当选项被解析时,getopt_long 函数返回 val。

下面是一个例程:

int main(int argc, char* argv[]) {  
  int opt;
  int option_index = 0;

  struct option long_options[] = {
    {"help",     no_argument,       0, 'h'},       
    {"generate", no_argument,       0, 'g'}, 
    {"save",     required_argument, 0, 's'},  
    {"load",     required_argument, 0, 'l'},   
    {0, 0, 0, 0} // end                  
  };

  const char *optstring = "hgs:l:";

  while ((opt = getopt_long(argc, argv, optstring, long_options, &option_index)) != -1) {
    switch (opt) {
      case 'h':
        printf("Usage: %s [options]\n", argv[0]);
        printf("-h, --help            display this help message\n");
        printf("-g, --generate        generate file\n");
        printf("-s, --save FILE       save file\n");
        printf("-l, --load FILE       load file\n");
        exit(0);
        break;
      case 'g':
        generate_file(); /* custom code */
        exit(0);
        break; 
      case 's':
        save_file(optarg); /* custom code */
        exit(0);
        break;

      case 'l':
        load_file(optarg); /* custom code */
        printf("load file: %s\n", optarg);
        break;
          
      default:
        printf("?? getopt returned character code 0%o ??\n", opt);
        exit(0);
        break;
    }
  }

/* custom code */

return 0

getopt_long 按 longopts 数组的顺序解析长选项。也可以解析在optstring 中定义的短选项。

optstring 中每个字符代表一个短选项,并且可以指定该选项是否需要参数:
单个字符:表示一个不带参数的短选项。例如,h 表示选项 -h。
字符后跟冒号 ::表示一个需要参数的短选项。例如,s: 表示选项 -s 需要一个参数(可以是 -s value 或 -svalue)。
双冒号 :::表示一个带有可选参数的短选项。

optarg 是一个全局变量,当解析到一个需要参数的选项时(无论是短选项还是长选项),optarg 将指向该选项的参数值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李71~李先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值