winston 发表于 2012-3-9 23:20:52

C语言:getopt_long()函数的作用

   Linux系统下,需要大量的命令行选项,如果自己手动解析他们的话实在是有违软件复用的思想,不过还好,GNU C library留给我们一个解析命令行的接口(X/Open规范),好好使用它可以使你的程序改观不少。
    使用getopt_long()需要引入头文件:#include<getopt.h>
    现在我们使用一个例子来说明它的使用。
    一个应用程序需要如下的短选项和长选项
    短选项       长选项               作用
    -h         --help             输出程序命令行参数说明然后退出
    -o filename--output filename给定输出文件名
    -v         --version          显示程序当前版本后退出
    为了使用getopt_long()函数,我们需要先确定两个结构:
    1.一个字符串,包括所需要的短选项字符,如果选项后有参数,字符后加一个":"符号。本例中,这个字符串应该为"ho:v"。(因为-o后面有参数filename,所以字符后面需要加":")。
    2. 一个包含长选项字符串的结构体数组,每一个结构体包含4个域,第一个域为长选项字符串,第二个域是一个标识,只能为0或1,分别代表没有选项或有选项。第三个域永远为NULL。第四个选项域为对应的短选项字符串。结构体数组的最后一个元素全部位NULL和0,标识结束。在本例中,它应为以下的样子:

   const struct option long_options[] = {
      {"help", 0, NULL, 'h'},
      {"output", 1, NULL, 'o'},
      {"version", 0, NULL, 'v'},
      {NULL, 0, NULL, 0}
    };

   调用时需要把main的两个参数argc和argv以及上述两个数据结构传给getopt_long()函数。


#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
/**//* The name of this program. */
const char* program_name;
/**//* Prints usage information for this program to STREAM (typically
   stdout or stderr), and exit the program with EXIT_CODE. Does not
   return. */
void print_usage(FILE* stream, int exit_code)
{
    fprintf(stream, "Usage: %s options [ inputfile ]\n",
      program_name);
    fprintf(stream,
      "-h--hlep          Display this usage information.\n"
      "-o--output filename Write output to file.\n"
      "-v--verbose         Print verbose message.\n");
    exit (exit_code);
}
/**//* Main program entry point. ARGC contains number of argument list
   elements; ARGV is an array of pointers to them. */
int main(int argc, char *argv[])
{
    int next_option;
    /**//* A string listing valid short options letters. */
    const char* const short_options = "ho:v";
   
    /**//* An array describing valid long options. */
    const struct option long_options[] = {
      {"help", 0, NULL, 'h'},
    {"output", 1, NULL, 'o'},
    {"verbose", 0, NULL, 'v'},
    {NULL, 0, NULL, 0}    /**//* Required at end of array. */
    };
    /**//* The name of the file to receive program output, or NULL for
   * standard output.
   */
    const char* output_filename = NULL;
    /**//* Whether to display verbose messages. */
    int verbose = 0;
    /**//* Remember the name of the program, to incorporate in messages.
   * The name is stored in argv.
   */
    program_name = argv;
    do {
      next_option = getopt_long (argc, argv, short_options,
      long_options, NULL);
    switch (next_option)
    {
      case 'h':    /**//* -h or --help */
      /**//* User has requested usage information. Print it to
         * standard output, and exit with exit code zero
         * (normal termination).
         */
      print_usage(stdout, 0);
      case 'o':    /**//* -o or --output */
      /**//* This option takes an argument, the name of the
         * output file.
         */
      output_filename = optarg;
      break;
      case 'v':    /**//* -v or --verbose */
      verbose = 1;
      break;
      case '?':    /**//* The user specified an invalid option. */
      /**//* Print usage information to standard error, and exit
         * with exit code one (indicating abnormal
         * termination).
         */
      print_usage(stderr, 1);
      case -1:    /**//* Done with options. */
      break;
      default:    /**//* Something else: unexpected. */
      abort();
    }
    }
    while (next_option != -1);
    /**//* Done with options. OPTINO points to first nonoption argument.
   * FOr demonstration purposes, print them if the verbose option
   * was specified.
   */
    if (verbose)
    {
      int i;
    for (i = optind; i < argc; ++i)
      printf("Argument: %s\n", argv);
    }
    /**//* The main program goes here. */
    return 0;
}
页: [1]
查看完整版本: C语言:getopt_long()函数的作用