C语言-getopt函数


#include<unistd.h>
int getopt(int argc,char *const argv[],const char *optstring);


extern char *optarg;


extern int optind,opterr,optopt;

optstring为一个字符列表,每个字符代表一个单字符选项

全局变量:

optarg:存数据

optind

opterr:控制是否向STDERR打印错误。若值为0,则关闭打印错误信息

optopt:存储出错的option(如缺参数),或者不认识的option

函数说明:

getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数optstring
则代表欲处理的选项字符串。此函数会返回在argv 中下一个的选项字母,此字母会对应参数optstring
中的字母。如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg
即会指向此额外参数。如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符,如果不希望getopt()印出错信息,则只要将全域变量opterr设为0即可。

短参数定义:

getopt()使用opstring所指的字符串作为短参数列表,像“krf:d::"就是一个短参数列表,短参数的定义是一个‘-’后面跟一个字母或数字(例如命令ls
-a -l  getopt()函数接受前面有"-"的参数选项"a,l",当然ls -al也接受为"a,l")

其中短参数在getopt()定义分为下面几种:

1.若optstring中有一个字符后面紧跟一个冒号“:”,则表明该选项有一个关联值作为下一个参数(含f的参数要这样写" -f
filename"),若有两个冒号则代表则表示该关联值可有可无(注意:可选关联值的参数与关联值之间不能有空格,例如”-dvalue"是合法的,然而"-d
value"是不合法的)

2.不带值得参数也就是说短参数列表中“r‘就不用带关联值,还有不带值的参数可以连写,”k“与“r”就是不带值的参数,在命令中可以写成"-kr" 或者"-k
-r"

3.参数顺序不要求先后,例如"-kr -f opt.c -dopt"与"-f opt.c -dopt -kr"是合法的

返回值:

getopt()每次调用会逐次返回命令行传入的参数。

当没有参数的最后的一次调用时,getopt()将返回-1。

当解析到一个不在optstring里面的参数,或者一个必选值参数不带值时,返回‘?‘,对于解析到一个不在optstring里面的参数的情况,函数会报错,输出一个错误信息,如果不想输出错误信息,设置全局变量opterr为0就行或者用下面的方法(opstring开头加个冒号":")

当optstring是以‘:‘开头时,缺值参数也就是参数后面缺少关联值下会返回‘:‘,而不是‘?‘
,当然这不影响遇到解析到一个不在optstring里面的参数的情况,这种情况仍然返回‘?‘,而且函数不会输出错误信息(不知道为什么)

好了,接下来就是测试了,先贴代码


#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
int opt;
while((opt=getopt(argc,argv,":krf:d::"))!=-1)
{
switch(opt)
{
case ‘k‘:
case ‘r‘:
printf("Option %c\n",opt);
break;
case ‘f‘:
printf("Option %c with value %s\n",opt,optarg);
break;
case ‘d‘:
if(optarg!=0)
{
printf("Option %c ",opt);
printf(" value %s\n",optarg);
}
else
printf("Option without value %c\n",opt);
break;
case ‘?‘:
printf("Unknown option %c\n",optopt);
break;
case ‘:‘:
printf("-%c needs value\n",optopt);
break;
}
}
for(;optind<argc;optind++)
{
printf("Argument: %s\n",argv[optind]);
}
return 0;
}

测试语句"./a.out file -kr -ddoc -f a.out -q"

文章参考:http://blog.csdn.net/an_zhenwei/article/details/7947570

http://vopit.blog.51cto.com/2400931/440453

至于optind的内容可以参考http://blog.sina.com.cn/s/blog_64ba2b750100vz5b.html

C语言-getopt函数,码迷,mamicode.com

时间: 2024-08-08 08:39:26

C语言-getopt函数的相关文章

C语言getopt()函数

相关函数表头文件 #include<unistd.h> 定义函数 int getopt(int argc,char * const argv[ ],const char * optstring); 函数说明 该函数的argc和argv参数通常直接从main()的参数直接传递而来.optstring是选项字母组成的字串.如果该字串里的任一字符后面有冒号,那么这个选项就要求有选项参数. 当给定getopt()命令参数的数量 (argc).指向这些参数的数组 (argv) 和选项字串 (optstr

C语言getopt

By francis_hao    Jul 5,2017 getopt:分析命令行选项 概述 #include <unistd.h>int getopt(int argc, char * const argv[], const char *optstring);extern char *optarg;extern int optind, opterr, optopt; 描述 getopt()函数分析命令行参数,它的参数argc和argv就是程序传递给main()函数的参数,一个以'-'(不是仅

[C/C++基础] C语言常用函数sprintf和snprintf的使用方法

Sprintf 函数声明:int sprintf(char *buffer, const char *format [, argument1, argument2, -]) 用途:将一段数据写入以地址buffer开始的字符串缓冲区 所属库文件: <stdio.h> 参数:(1)buffer,将要写入数据的起始地址:(2)format,写入数据的格式:(3)argument:要写的数据,可以是任何格式的. 返回值:实际写入的字符串长度 说明:此函数需要注意缓冲区buffer溢出,要为写入的arg

C语言strlen()函数用法

C语言strlen()函数:返回字符串的长度 头文件:#include <string.h> strlen()函数用来计算字符串的长度,其原型为:unsigned int strlen (char *s);  s为指定的字符串 eg: #include<stdio.h> #include<string.h> int main() { char *str1 = "http://see.xidian.edu.cn/cpp/u/shipin/"; char

C语言_函数

函数 1.函数构成 int main(int argc, const char * argv[]) { // insert code here... return 0; } 返回值类型  函数名(函数参数) { 函数体语句: return 返回值: } 2.函数分类 1)标准函数 由官方或第三方库提供的函数,可以直接调用,无需实现: 2)自定义函数 由程序员自己实现的函数: 3.编写函数的步骤 1)声明函数 写在头文件 2)实现函数 写在原文件 3)调用函数 C阶段,一般在主函数调用 [注意事项

C语言学习-函数和递归函数

C源程序是由函数组成的,有且只有一个主函数(main()函数). 一.函数 1.自定义函数的书写格式: 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…) { 函数体 }例如: 1 include <stdio.h> 2 void test(); 3 4 int main() { 5 test(); 6 return 0; 7 } 8 9 void test() { 10 11 printf("hello world!"); 12 13 } 2.定义函数的

C语言基础 函数--思想的体现

1.C语言由函数组成,main函数又称主函数,是程序的入口. 1.1函数定义:    1.1.1    格式:        返回值类型 函数名(形式参数列表)        {            函数体        }     1.1.2    函数名:  不允许相同 1.1.3    参数注意点:        1.形式参数: 定义函数时函数名后面括号中的参数,简称形参        2.实际参数: 调用函数时传入的具体数据,简称实参        3.实参个数必须等于形参个数    

C语言中函数和指针的参数传递

最近写二叉树的数据结构实验,想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个例子讨论一下c语言中指针作为形参的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个数据引用同一个数据,那么更改任意的一个都相当于更改了本体,那么另一个数据所对应的值也会改变,可是C中是没有这个概念的.所以就产生了一些东西.和我们本来想的有差别. 一.明确C语言中函数的入口: C语言中函数的形参负责接收外部数据,那么数据究竟怎么进入函数的呢,其实我们在函数体内操作的形参只是传递进来

从头开始-05.C语言中函数

函数: 完成特定功能代码段 特点:函数只有调用的时候才会执行 定义格式:返回值类型 函数名称(形参类型 形参名称,...){ 语句; ...  } 函数参数 形式参数:在定义函数的时候,函数名后面小括号中的参数 实际参数:在函数调用的时候,函数名后面小括号中的参数 注意点: 形参与实参必须一一对应 实参与形参的类型必须一致 基本数据类型作为函数参数传递是值传递 组作为函数参数传递是地址传递 指针作为函数参数传递是地址传递 结构体作为函数参数传递是值传递 返回值: return 作用: 1.结束函