在编写需要命令行参数的C程序的时候,往往我们需要先解析命令行参数,然后根据这些参数来启动我们的程序。

C的库函数中提供了两个函数可以用来帮助我们解析命令行参数:getopt、getopt_long。

getopt可以解析短参数,所谓短参数就是指选项前只有一个“-”(如-t),而getopt_long则支持短参数跟长参数(如"--prefix")。

getopt函数

#include<unistd.h>
int getopt(int argc,char * const argv[],const char *optstring);extern char *optarg;   //当前选项参数字串(如果有)
extern int optind;     //argv的当前索引值

各参数的意义:

argc:通常为main函数中的argc

argv:通常为main函数中的argv

optstring:用来指定选项的内容(如:"ab:c"),它由多个部分组成,表示的意义分别为:

1.单个字符,表示选项。

2 单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。

3 单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟。如果跟一个参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。

调用该函数将返回解析到的当前选项,该选项的参数将赋给optarg,如果该选项没有参数,则optarg为NULL。下面将演示该函数的用法

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <string.h>
 4
 5 int main(int argc,char *argv[])
 6 {
 7     int opt=0;
 8     int a=0;
 9     int b=0;
10     char s[50];
11     while((opt=getopt(argc,argv,"ab:"))!=-1)
12     {
13         switch(opt)
14         {
15             case 'a':a=1;break;
16             case 'b':b=1;strcpy(s,optarg);break;
17         }
18     }
19     if(a)
20         printf("option a\n");
21     if(b)
22         printf("option b:%s\n",s);
23     return 0;
24 }

View Code

编译之后可以如下调用该程序

getopt_long函数

与getopt不同的是,getopt_long还支持长参数。

#include <getopt.h>
int getopt_long(int argc, char * const argv[],const char *optstring,const struct option *longopts, int *longindex);

前面三个参数跟getopt函数一样(解析到短参数时返回值跟getopt一样),而长参数的解析则与longopts参数相关,该参数使用如下的结构

struct option {//长参数名const char *name;/*表示参数的个数no_argument(或者0),表示该选项后面不跟参数值required_argument(或者1),表示该选项后面一定跟一个参数optional_argument(或者2),表示该选项后面的参数可选*/int has_arg;//如果flag为NULL,则函数会返回下面val参数的值,否则返回0,并将val值赋予赋予flag所指向的内存int *flag;//配合flag来决定返回值int val;
};

参数longindex,表示当前长参数在longopts中的索引值,如果不需要可以置为NULL。

下面是使用该函数的一个例子

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <getopt.h>
 4
 5 int learn=0;
 6 static const struct option long_option[]={
 7    {"name",required_argument,NULL,'n'},
 8    {"learn",no_argument,&learn,1},
 9    {NULL,0,NULL,0}
10 };
11
12 int main(int argc,char *argv[])
13 {
14     int opt=0;
15     while((opt=getopt_long(argc,argv,"n:l",long_option,NULL))!=-1)
16     {
17         switch(opt)
18         {
19             case 0:break;
20             case 'n':printf("name:%s ",optarg);
21         }
22     }
23     if(learn)
24         printf("learning\n");
25 }

View Code

编译之后可以如下调用该程序

转载于:https://www.cnblogs.com/runnyu/p/4943704.html

C语言中使用库函数解析命令行参数相关推荐

  1. 从源码的角度看Go语言flag库如何解析命令行参数!

    我上周五喝酒喝到晚上3点多,确实有点罩不住啊,整个周末都在休息和睡觉,文章鸽了几天,想不到就有两个人跑了. 不得不感叹一下,自媒体的太残酷了,时效就那么几天,断更就没人爱.你们说好了爱我的,爱呢?哼 ...

  2. 如何在Java中解析命令行参数?

    在Java中解析命令行参数的好方法是什么? #1楼 我不建议使用Apache Common CLI库,因为它是非线程安全的. 它使用带有静态变量和方法的有状态类来进行内部工作(例如OptionBuil ...

  3. Python 中的解析命令行参数

    argparse argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生 ...

  4. 在C#中解析命令行参数的最佳方法? [关闭]

    构建带有参数的控制台应用程序时,可以使用传递给Main(string[] args) . 过去,我只是索引/循环该数组,并做了一些正则表达式来提取值. 但是,当命令变得更复杂时,解析可能会变得很丑陋. ...

  5. Python3中使用argparse模块解析命令行参数

    argparse是Python的一个标准模块,用于解析命令行参数,即解析sys.argv中定义的参数.实现在:https://github.com/python/cpython/blob/main/L ...

  6. python使用argparse解析命令行参数

    python使用argparse解析命令行参数 你的程序如何能够解析命令行选项(位于sys.argv中) #示意使用sys.argv进行参数解析: #注意,sys.argv中第0个索引是函数本身,所以 ...

  7. python 命令-python解析命令行参数的三种方法详解

    这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...

  8. python输入正方形边长值、计算其面积_尝试修改列6.2编写命令行参数解析的程序,解析命令行参数所输入边长的值,计算并输出正方形的周长和面积。_学小易找答案...

    [简答题] [单选题]ZigBee 中每个协调点最多可连接______个节点,一个ZigBee网络最多可容纳______个节点.( ) [资料题]DWord-Ans.pdf 索引和目录.pdf 完成效 ...

  9. UE4如何解析命令行参数

    http://blog.csdn.net/chinahaerbin/article/details/51517896 UE4如何解析命令行参数 [cpp] view plaincopy // 获取命令 ...

最新文章

  1. 一道拉普拉斯逆变换练习题和对应的数值计算方法
  2. EMC NetWorker恢复oracle指南
  3. DM365 dvsdk_2_10_01_18开发环境搭建
  4. laravel中的数据迁移表结构、字段类型、定义整理
  5. 通过Spring Data Neo4J操作您的图形数据库
  6. 一套漂亮的Bootstrap模板
  7. linux关闭cups命令,使用linux的cupsenable命令启动指定的打印机
  8. 【状压DP】poj2686 Traveling by Stagecoach
  9. 迷途指针 new delete
  10. 为什么我们应该使用 HTML5 开发网站
  11. 动态代理的好处是什么
  12. 入手评测 戴尔游匣G15锐龙版 怎么样
  13. eNSP-配置单臂路由与静态路由实验
  14. 六星经典CSAPP笔记(2)信息的操作和表示
  15. [NOIP模拟赛]棋子游戏
  16. 图像互信息(MI)的计算(Python版本)
  17. thymeleaf笔记
  18. 09年第33周,时尚数码3c超人加潮人10大酷品装备推荐(上)
  19. 【效能工具】记录常用效能工具
  20. PHP开发人员的8个分布式计算谬论

热门文章

  1. hibernate lazy加载
  2. Linux下mysqldump的使用
  3. .NET开发系列工具之NDoc:让NDoc支持简体中文!(含修改了的源代码)
  4. PostgreSQL数据库图像搜索插件imgsmlr部署
  5. 算法导论之字符串匹配
  6. mine 规范_《民用建筑热工设计规范》GB50176-2016
  7. python select模块_Python之select模块解析
  8. Spring Security快速上手
  9. jquery lt选择器与gt选择器
  10. Unity学习笔记3 简易2D横版RPG游戏制作(三)