linux程序如何获得参数

/*
getopt的用法和用途类似与在shell脚本当中使用的getopts命令一样,现在讨论在系统调用情况下的使用
包含头文件:#include<getopt.h>
原型:
 int getopt (int _argc ,char *const *_argv, const char * _shortopts)
 int getopt_long(int _argc,char *const *_argv,const char *shortopts,const struct option *_longopts,int *_longind);

参数解释:
_argc :即main当中的argc
_argv :即main当中的argv
_shortopts:选项字符串,该参数指定了解析命令行参数的规则。getopt认可的命令行选项参数是通过"-"进行的,例如,ls -l的“-l”。该参数中,如果某个选项有输入数据,则在该选项字符的后面应该包括":",如ls -l ./a,在指定本参数时,应该用“l:”。对于该选项,有一点需要注意,如果该参数的第一个字符串是“:”,则getopt发现无效参数后并不返回失败,而是返回“?”或则“:",表示无效参数,则返回":",
getopt只能支持单字符的选项,如-l,-a等,如果需要支持多字符串的选项,如-file等,就需要用到getopt_long通过指定一个struct option 类型的结构数组,将多字符的选项映射为单个字符,从而实现了对个字符选项的支持。struct option的结构如下:
struct option
{
	const char * name;//定义了多字符的选项名称
	int has_arg;//定义了是否有选项值,如果该值为0,则表示没有选项值,如果该值为1,表示该选项有选项值,如果该值为2,表示该选项的值是可有可无的
	int *flag;//如果该成员定义为NULL,则点用getopt_long的返回之为该结构val字段的值,如果该成员不为NULL,getopt_long调用后,将在该参数所指向的  变量中添加val值,并且getopt_long返回0,通常该成员定义为NULL即可

	int val;//长选项对应的短选项名称
};


_longind:输出参数,如果该参数没有设置为NULL,那么它是一个指向整型变量的指针,在getopt_long运行时,该整型变量会被赋为获取到的选项在结构数组当中的索引值

返回值说明:
"?":表明getopt返回一个未在_shortopts定义的选项
“:”:表明该选项需要选项值,而实际为输入选项值
-1:表明getopt解析完毕,后面已经没有选项。
0:在getopt_long的结构数组参数_longopts中的成员flag定义了值,此时,getopt_long返回0,而选项的参数将储存在flag所指向的变量中
其他:回返的选项字符

在使用getopt是,需要注意与该系统调用相关的全局变量的使用,详细说明如下。
optind:整型变量,存放环境变量属猪argv的当前索引值,当调用getopt循环取选项结束(getopt返回-1),剩余的参数在argv[optind]~argv[argc-1]中
optarg:字符串指针,当处理一个带有选项的参数时,全局变量optarg将存放该选项的值。
optopt:整型变量,当点用getopt发现无效的选项(getopt返回“?”或“:”)时,此时optopt包含了当前无效的选项。
opterr:整型变量,如果调用getopt前设置该变量为0,则getopt在发现错误时不输出任何信息。

*/



#include<getopt.h>
#include<stdio.h>

int save_flag_arg;
char *opt_arg_value;
struct option longopts[]={
	{"flag",no_argument,&save_flag_arg,'f'},
	{"name",required_argument,NULL,'n'},
	{NULL,0,NULL,0},
};

int main(int argc,char *argv[])
{
	int i,c;
	while((c=getopt_long(argc,argv,":n:f",longopts,NULL)) != -1)
	{
		switch(c)
		{
			case 'n':
				opt_arg_value =optarg;
				printf("name is %s.\n",opt_arg_value);
				break;
			case 0 :
				if (save_flag_arg =='f')
				{
					printf("flag argument found!\n");
				}
				break;
			case ':':
				printf("argument %c need value.\n",optopt);
				break;
			case '?':
				printf("Invalid argument %c!\n",optopt);
				break;
		}
	}
	
	return 0;

}

/*

我直接的终端运行是如下:
1-------------------------------------------
jiangjian@jiangjian-K42JZ:~/cprogram/process$ ./getopt --name jiangjian  //注意如果是多字符的话前面得写"--",单字符都可
name is jiangjian.
jiangjian@jiangjian-K42JZ:~/cprogram/process$ 


2  
jiangjian@jiangjian-K42JZ:~/cprogram/process$ ./getopt -n jiangjian
name is jiangjian.
jiangjian@jiangjian-K42JZ:~/cprogram/process$ 

*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值