C语言中使用库函数解析命令行参数
在编写需要命令行参数的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。下面将演示该函数的用法
#include <stdio.h>
#include <unistd.h>
#include <string.h> int main(int argc,char *argv[])
{
int opt=;
int a=;
int b=;
char s[];
while((opt=getopt(argc,argv,"ab:"))!=-)
{
switch(opt)
{
case 'a':a=;break;
case 'b':b=;strcpy(s,optarg);break;
}
}
if(a)
printf("option a\n");
if(b)
printf("option b:%s\n",s);
return ;
}
编译之后可以如下调用该程序

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。
下面是使用该函数的一个例子
#include <stdio.h>
#include <string.h>
#include <getopt.h> int learn=;
static const struct option long_option[]={
{"name",required_argument,NULL,'n'},
{"learn",no_argument,&learn,},
{NULL,,NULL,}
}; int main(int argc,char *argv[])
{
int opt=;
while((opt=getopt_long(argc,argv,"n:l",long_option,NULL))!=-)
{
switch(opt)
{
case :break;
case 'n':printf("name:%s ",optarg);
}
}
if(learn)
printf("learning\n");
}
编译之后可以如下调用该程序

C语言中使用库函数解析命令行参数的更多相关文章
- linux 中解析命令行参数(getopt_long用法)
linux 中解析命令行参数(getopt_long用法) http://www.educity.cn/linux/518242.html 详细解析命令行的getopt_long()函数 http:/ ...
- optparse模块解析命令行参数的说明及优化
一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...
- python解析命令行参数
常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...
- boost之program_options库,解析命令行参数、读取配置文件
一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...
- Windows下解析命令行参数
linux通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析命令行参数. 移植到Windows下 getopt.h #ifndef _GETO ...
- 3.QT中QCommandLineParser和QCommandLineOption解析命令行参数
1 新建项目 main.cpp #include <QCoreApplication> #include <QCommandLineParser> #include & ...
- 使用 Apache Commons CLI 解析命令行参数示例
很好的输入参数解析方法 ,转载记录下 转载在: https://www.cnblogs.com/onmyway20xx/p/7346709.html Apache Commons CLI 简介 Apa ...
- Shell 参数(2) --解析命令行参数工具:getopts/getopt
getopt 与 getopts 都是 Bash 中用来获取与分析命令行参数的工具,常用在 Shell 脚本中被用来分析脚本参数. 两者的比较 (1)getopts 是 Shell 内建命令,geto ...
- getopt_long函数解析命令行参数
转载:http://blog.csdn.net/hcx25909/article/details/7388750 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用 ...
随机推荐
- centos 安装使用smb
http://blog.csdn.net/edu_enth/article/details/52964295
- MFC中CTime获取日期时间的方法
MFC中CTime类的功能非常强大,可以获取年.月.日.小时.分钟.秒.星期等等,最最重要的是可根据需要去格式化.下面是具体的使用方式: ① 定义一个CTime类对象 CTime time; ② 得到 ...
- 28.Implement strStr()---kmp
题目链接:https://leetcode.com/problems/implement-strstr/description/ 题目大意:字符串匹配,从字符串中,找到给定字符串第一次出现的位置下标, ...
- Appium+python自动化18-brew、carthage和appium-doctor【转载】
前言 本篇安装brew.carthage,解决启动appium时的报错问题,另外安装appium-doctor检查appium的环境 1.brew 2.carthage 3.appium-doctor ...
- 制作servlet模板
制作servlet模板 选中window-->preference--->搜索template--->选中java下面的template new一个 Name的设置,当你在eclip ...
- SQL 并发-转
脏读.不可重复读 共享锁.悲观锁 和 事务五种隔离级别 一.脏读.不可重复读.幻读1.脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个 ...
- HDU 4920.Matrix multiplication-矩阵乘法
Matrix multiplication Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- poj2763(树链剖分 - 边权)
poj2763 题意 给定一个树形图,某人原来在 s 点,每条边(路)有通过的时间花费,有两种操作:1. 查询某人到 u 点花费的时间 2. 更新某条路的时间花费. 分析 权值在边上,可以把它们 &q ...
- RMI,socket,rpc,hessian,http比较
SOCKET使用时可以指定协议TCP,UDP等: RIM使用JRMP协议,JRMP又是基于TCP/IP: RPC底层使用SOCKET接口,定义了一套远程调用方法: HTTP是建立在TCP上,不是使用S ...
- [HDU6240]Server
题目大意: 用$n$条线段覆盖区间$[1,t]$上的整点.每条线段有4个属性$(S_i,T_i,A_i,B_i)$,表示用第$i$条线段可以覆盖区间$[S_i,T_i]$.若选取线段的集合为$S$,最 ...