getopt和getoptlong被用来解析命令行参数。
 
一、getopt
#include <unistd.h>
extern char *optarg;
extern int optind,
extern int opterr,
extern int optopt;
int getopt(int argc, char * const argv[], const char *optstring);

定义了四个全局变量:optarg是选项的参数指针,optind记录目前查找的位置,当opterr = 0时,getopt不向stderr输出错误信息。当命令选项字符不包括在optstring中或者缺少必要的参数时,该选项存储在optopt中,getopt返回 '?'

     getopt调用一次,返回一次选项,当检查不到参数时,返回-1,同时,optind储存第一个不包含选项的命令行参数。
     optstring参数可以有以下元素。
     1.单个字符:表示选项
     2.单个字符后接一个冒号:表示该选项必须跟一个参数,参数紧跟在选项后,或以一个空格隔开,将参数的指针赋给optarg。
     3.单个字符后跟两个冒号:表示该选项必须跟一个参数,且不能用空格隔开。
例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> int main(int argc, char **argv)
{
int opt = ; while ((opt = getopt(argc, argv, "if:?lr::")) != -)
{
switch(opt)
{
case 'i':
case 'l':
printf("option: %c\n", opt);
break;
case 'f':
printf("filename: %s\n", optarg);
break;
case 'r':
printf("arg:%s\n", optarg);
break;
case ':':
printf("option needs a value\n");
break;
case '?':
printf("unknow option: %c\n", optopt);
break;
}
} for (; optind < argc; optind++)
{
printf("argument: %s\n", argv[optind]); ar return ;
}
     二、getoptlong
     getoptlong就是添加了对长选项支持的getopt,getoptlong比getopt多两个参数,struct option *longopts和int *longindex,后者用到的少,一般置为NULL。直接来看struct option 结构
struct option
{
char *name;
int has_arg;
int *flag;
int val;
};
     name表示的是长参数名,has_arg有三个值,当has_arg = no_argument(即0)时,表示该参数后面不跟参数值,当has_arg = required_argument(即1)时,表示参数后面一定跟参数值,当has_arg = optional_argument(即2)时,表示该参数后面可跟参数值,也可不跟。flag   当这个指针为空的时候,函数直接将val的数值从getopt_long的返回值返回出去,当它非空时,val的值会被赋到flag指向的整型数中,而函数返回值为0 。 val    用于指定函数找到该选项时的返回值,或者当flag非空时指定flag指向的数据的值。
定义option試例:
struct option longopts[] =
{
{"initialize", , NULL, 'i'},
{"filename", , NULL, 'f'},
{"list", , NULL, 'l'},
{"restart", , NULL, 'r'}
};
例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> #define _GNU_SOURCE
#include <getopt.h> int main(int argc, char **argv)
{
int opt; struct option longopts[] =
{
{"initialize", , NULL, 'i'},
{"filename", , NULL, 'f'},
{"list", , NULL, 'l'},
{"restart", , NULL, 'r'}
}; while ((opt = getopt_long(argc, argv, ":if:lr", longopts, NULL)) != -)
{
switch(opt)
{
case 'i':
case 'l':
case 'r':
printf("option: %c\n", opt);
break;
case 'f':
printf("filename: %s\n", optarg);
break;
case ':':
printf("option needs a value\n");
break;
case '?':
printf("unknow option: %c\n", optopt);
break;
}
} for (; optind < argc; optind++)
{
printf("argument: %s\n", argv[optind]); } return ;
}

最新文章

  1. solution to E: failed to fetch .......
  2. F - To the Max
  3. 重新想象 Windows 8 Store Apps (53) - 绑定: 与 ObservableCollection CollectionViewSource VirtualizedFilesVector VirtualizedItemsVector 绑定
  4. Java基础知识强化之集合框架笔记67:Hashtable的实现原理
  5. 【POJ3006】Dirichlet&#39;s Theorem on Arithmetic Progressions(素数筛法)
  6. 男同胞爱小秘籍--作为爱他的女朋友了几天C规划
  7. C#程序设计六大原则记录
  8. Sass入门:第四章
  9. 多线程---其他方法 停止线程、守护线程、join方法
  10. HyperSnap(屏幕抓图工具) 8.11.03 官方简体中文特别版
  11. 【java】正则表达式简单示例
  12. [springMvc] 源码分析笔记(一)
  13. 10本Java架构师必读书籍
  14. Oracle 11g R2创建数据库之手工建库方式
  15. 转:获得数据库自增长ID(ACCESS)与(SQLSERVER)
  16. Python 操作redis有序集合(sorted set)
  17. Zookeeper 介绍翻译
  18. day 88 Vue学习之八geetest滑动验证
  19. 内核工具 – Sparse 简介【转】
  20. 今天廷鹏师弟来的java建议

热门文章

  1. 将自己打代码添加到cocoapods
  2. zookeeper集群搭建
  3. byte[] 转成图片方法
  4. HTML5 学习总结(四)——canvas绘图、WebGL、SVG
  5. 读书笔记--SQL必知必会01--了解SQL
  6. 【目录】JVM目录
  7. 福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!
  8. 怎么调试lua性能
  9. 翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 2
  10. wxWidgets