getopt_long及其使用
来源:互联网 发布:最新地区数据库 编辑:程序博客网 时间:2024/04/29 05:52
使用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。
每次调用getopt_long,它会解析一个符号,返回相应的短选项字符,如果解析完毕返回-1。所以需要使用一个循环来处理所有的参数,而相应的循环里会使用switch语句进行选择。如果getopt_long遇到一个无效的选项字符,它会打印一个错误消息并且返回'?',很多程序会打印出帮助信息并且中止运行;当getopt_long解析到一个长选项并且发现后面没有参数则返回':',表示缺乏参数。当处理一个参数时,全局变量optarg指向下一个要处理的变量。当getopt_long处理完所有的选项后,全局变量optind指向第一个未知的选项索引。
这一个例子代码为下:
//编译使用gcc -o getopt_long getopt_long.c
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
const char* program_name;
void print_usage (FILE* stream, int exit_code)
{
fprintf (stream, "Usage: %s options [ inputfile ... ]/n", program_name);
fprintf (stream, " -h --help 显示这个帮助信息./n"
" -o --output filename 将输出定位到文件./n"
" -v --version 打印版本信息./n");
exit (exit_code);
}
int main (int argc, char* argv[])
{
int next_option;//下一个要处理的参数符号
int haveargv = 0;//是否有我们要的正确参数,一个标识
const char* const short_options = "ho:v";
const struct option long_options[] = {
{ "help", 0, NULL, 'h' },
{ "output", 1, NULL, 'o' },
{ "version", 0, NULL, 'v' },
{ NULL, 0, NULL, 0 }};//最后一个元素标识为NULL
const char* output_filename = NULL;
int verbose = 0;
program_name = argv[0];
do
{
next_option = getopt_long (argc, argv, short_options, long_options, NULL);
switch (next_option)
{
case 'h':
haveargv = 1;
print_usage (stdout, 0);
case 'o':
output_filename = optarg;
haveargv = 1;
break;
case 'v':
verbose = 1;
haveargv = 1;
break;
case ':':
break;
case '?':
print_usage (stderr, 1);
case -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;
}
- getopt_long及其使用
- getopt_long及其使用
- getopt_long及其使用
- getopt_long及其使用
- getopt_long及其使用
- getopt_long及其使用
- (转)getopt_long及其使用
- Linux编程:getopt_long及其使用
- getopt_long使用
- getopt_long的使用
- getopt_long的使用
- getopt_long的使用心得
- getopt_long使用介绍
- getopt_long
- getopt_long
- getopt_long
- getopt_long()
- getopt_long
- Thinking in Java 读书笔记 2
- ntohs, ntohl, htons,htonl inet_aton等详解
- 两次调用 -> 操作符
- 网络通信中,发送结构体方法
- JMail发邮件
- getopt_long及其使用
- Linux下常用函数-字符串函数
- JMX 开发必备
- 网络管理师:网络大时代的新贵英雄
- android JNI (2) - load .so file with JNI
- sybase存储过程的写法以及java的调用方法
- C#线程同步的几种方法(转)
- 任正非:要快乐地度过充满困难的一生
- NO.0 WebApplication开发知识库