|
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[0].
- */
- program_name = argv[0];
- 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[i]);
- }
- /**//* The main program goes here. */
- return 0;
- }
复制代码 |
|