Linux系统下,需要大量的命令行选项,如果自己手动解析他们的话实在是有违软件复用的思想,不过还好,GNU C library留给我们一个解析命令行的接口(X/Open规范),好好使用它可以使你的程序改观不少。
使用getopt_long()需要引入头文件 #include <getopt.h> 现在我们使用一个例子来说明它的使用。 一个应用程序需要如下的短选项和长选项。
-h --help 输出程序命令行参数说明然后退出 为了使用getopt_long函数,我们需要先确定两个结构: 1.一个字符串,包括所需要的短选项字符,如果选项后有参数,字符后加一个":"符号。本例中,这个字符串应该为"ho:v"。(因为-o后面有参数filename,所以字符后面要加":") 2.一个包含长选项字符串的结构体数组,每一个结构体包含4个域,第一个域为长选项字符串,第二个域是一个标识,只能为0或1,分别代表没有、有。 第三个域永远为NULL。第四个域为对应的短选项字符串。结构体数组的最后一个元素全部为NULL和0,标识结束。在本例中,它应该像一下的样子: const struct option long_options[] = { 调用时需要把main的两个参数argc和argv以及上述两个数据结构传给getopt_long。 这一个例子代码为下:
//编译使用gcc -o getopt_long getopt_long.c /*程序的名字*/ /* 打印程序参数 */
program_name = argv[0]; do { next_option = getopt_long (argc, argv, short_options, long_options, NULL); switch (next_option) { case 'h': /* -h or --help */ haveargv = 1; print_usage (stdout, 0); case 'o': /* -o or --output */ /* 此时optarg指向--output后的filename */ output_filename = optarg; haveargv = 1; break; case 'v': /* -v or --version */ verbose = 1; haveargv = 1; break; case ':': /* 缺乏长选项内容 */ break; case '?': /* 出现一个未指定的参数*/ print_usage (stderr, 1); case -1: /* 处理完毕后返回-1 */ if (!haveargv) { print_usage (stderr, 1); } break; default: /* 未指定的参数出现,出错处理 */ print_usage (stderr, 1); break; } }while (next_option !=-1); if (verbose) { int i; for (i = optind; i < argc; ++i) printf ("Argument: %s\n", argv[i]); } return 0; } |
|
来自: danydany_ok > 《C》