- 浏览: 980367 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
custjcy:
不错,赞一个。尤其是这个,在查找指定目录下,列出所有包含某个字 ...
shell命令的批量修改文件内容 -
qw173795180:
你好,请问Start这个参数怎么使用不了?
视频播放flv player的使用 -
cheeruplc:
xml进行修改之后 刷新请求 不执行 看了你的博文解决 ...
同一页面无法多次使用XmlHttp发起Ajax请求的真实原因--l转 -
dongbiying:
没有想到还有map的概念
js数组的操作及数组与字符串的相互转化 -
wangtuda:
打酱油的~
js中随机排序
getopt详解
- 博客分类:
- linux编程
getopt被用来解析命令行选项参数。就不用自己写东东处理argv了。
#include <unistd.h>
extern char *optarg; //选项的参数指针
extern int optind, //下一次调用getopt的时,从optind存储的位置处重新开始检查选项。
extern int opterr, //当opterr=0时,getopt不向stderr输出错误信息。
extern int optopt; //当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,该选项存储在optopt中,getopt返回'?’、
int getopt(int argc, char * const argv[], const char *optstring);
调用一次,返回一个选项。 在命令行选项参数再也检查不到optstring中包含的选项时,返回-1,同时optind储存第一个不包含选项的命令行参数。
首先说一下什么是选项,什么是参数。
字符串optstring可以是下列元素:
1.单个字符,表示选项;
2.单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
3 单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(这个特性是GNU的扩张)。
getopt处理以'-’开头的命令行参数,如optstring="ab:c::d::",命令行为getopt.exe -a -b host -ckeke -d haha
在这个命令行参数中,-a,-b,-c和-d就是选项元素,去掉'-',a,b,c,d就是选项。host是b的参数,keke是c的参数。但haha并不是d的参数,因为它们中间有空格隔开。
还要注意的是默认情况下getopt会重新排列命令行参数的顺序,所以到最后所有不包含选项的命令行参数都排到最后。
如:getopt.exe -a ima -b host -ckeke -d haha, 到最后命令行参数的顺序是: -a -b host -ckeke -d ima haha
如果optstring中的字符串以'+'加号开头或者环境变量POSIXLY_CORRE被设置。那么一遇到不包含选项的命令行参数,getopt就会停止,返回-1。
[cpp] view plaincopyprint?
01.#include <stdio.h>
02.#include <stdlib.h>
03.#include <unistd.h>
04.int main(int argc, char **argv)
05.{
06. int result;
07. opterr = 0; //使getopt不行stderr输出错误信息
08. while( (result = getopt(argc, argv, "ab:c::")) != -1 )
09. {
10. switch(result)
11. {
12. case 'a':
13. printf("option=a, optopt=%c, optarg=%s\n", optopt, optarg);
14. break;
15. case 'b':
16. printf("option=b, optopt=%c, optarg=%s\n", optopt, optarg);
17. break;
18. case 'c':
19. printf("option=c, optopt=%c, optarg=%s\n", optopt, optarg);
20. break;
21. case '?':
22. printf("result=?, optopt=%c, optarg=%s\n", optopt, optarg);
23. break;
24. default:
25. printf("default, result=%c\n",result);
26. break;
27. }
28. printf("argv[%d]=%s\n", optind, argv[optind]);
29. }
30. printf("result=-1, optind=%d\n", optind); //看看最后optind的位置
31. for(result = optind; result < argc; result++)
32. printf("-----argv[%d]=%s\n", result, argv[result]);
33. //看看最后的命令行参数,看顺序是否改变了哈。
34. for(result = 1; result < argc; result++)
35. printf("\nat the end-----argv[%d]=%s\n", result, argv[result]);
36. return 0;
37.}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int result;
opterr = 0; //使getopt不行stderr输出错误信息
while( (result = getopt(argc, argv, "ab:c::")) != -1 )
{
switch(result)
{
case 'a':
printf("option=a, optopt=%c, optarg=%s\n", optopt, optarg);
break;
case 'b':
printf("option=b, optopt=%c, optarg=%s\n", optopt, optarg);
break;
case 'c':
printf("option=c, optopt=%c, optarg=%s\n", optopt, optarg);
break;
case '?':
printf("result=?, optopt=%c, optarg=%s\n", optopt, optarg);
break;
default:
printf("default, result=%c\n",result);
break;
}
printf("argv[%d]=%s\n", optind, argv[optind]);
}
printf("result=-1, optind=%d\n", optind); //看看最后optind的位置
for(result = optind; result < argc; result++)
printf("-----argv[%d]=%s\n", result, argv[result]);
//看看最后的命令行参数,看顺序是否改变了哈。
for(result = 1; result < argc; result++)
printf("\nat the end-----argv[%d]=%s\n", result, argv[result]);
return 0;
}
unistd里有个optind变量,每次getopt后,这个索引指向argv里当前分析的字符串的下一个索引;
因此argv[optind]就能得到下个字符串,通过判断是否以 '-'开头就可。
下面是个测试程序:
[cpp] view plaincopyprint?
01.#include <stdio.h>
02.#include <unistd.h>
03.int main(int argc, char* argv[])
04.{
05. int tmp = 4;
06.
07. while( (tmp = getopt(argc, argv, "abck")) != -1 )
08. {
09.
10. printf("-%c\t", tmp);
11. int opt = optind ;
12. while( opt < argc )
13. {
14. if ( argv[opt][0] != '-' )
15. {
16. printf("%s\t", argv[opt]);
17. opt ++;
18. }
19. else
20. break;
21. }
22. printf("\n");
23. }
24. getchar();
25.}
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
int tmp = 4;
while( (tmp = getopt(argc, argv, "abck")) != -1 )
{
printf("-%c\t", tmp);
int opt = optind ;
while( opt < argc )
{
if ( argv[opt][0] != '-' )
{
printf("%s\t", argv[opt]);
opt ++;
}
else
break;
}
printf("\n");
}
getchar();
}
函数说明:
getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数optstring 则代表欲处理的选项字符串。此函数会返回在argv 中下一个的选项字母,此字母会对应参数optstring 中的字母。如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符,如果不希望getopt()印出错信息,则只要将全域变量opterr设为0即可。
返回值 如果找到符合的参数则返回此参数字母,如果参数不包含在参数optstring 的选项字母则返回“?”字符,分析结束则返回-1。
范例:
[cpp] view plaincopyprint?
01.#include<stdio.h>
02.#include<unistd.h>
03.int main(int argc,char **argv)
04.{
05.int ch;
06.opterr = 0;
07.while((ch = getopt(argc,argv,”a:bcde”))!= -1)
08.switch(ch)
09.{
10.case ‘a’:
11.printf(“option a:’%s’\n”,optarg);
12.break;
13.case ‘b’:
14.printf(“option b :b\n”);
15.break;
16.default:
17.printf(“other option :%c\n”,ch);
18.}
19.printf(“optopt +%c\n”,optopt);
20.}
#include<stdio.h>
#include<unistd.h>
int main(int argc,char **argv)
{
int ch;
opterr = 0;
while((ch = getopt(argc,argv,”a:bcde”))!= -1)
switch(ch)
{
case ‘a’:
printf(“option a:’%s’\n”,optarg);
break;
case ‘b’:
printf(“option b :b\n”);
break;
default:
printf(“other option :%c\n”,ch);
}
printf(“optopt +%c\n”,optopt);
}
执行 $./getopt –b
option b:b
$./getopt –c
other option:c
$./getopt –a
other option :?
$./getopt –a12345
option a:’12345’
原文连接:http://www.diybl.com/course/3_program/c++/cppjs/20091031/180765.html
http://qxinli.com/post/2012-05-30/40028624644
发表评论
-
防火墙实现URL过滤原理
2014-05-08 18:45 4330对于URL过滤:1.HTTP URL过滤 2.https UR ... -
解决webserver在IE下载文件,文件名为乱码问题
2013-12-28 16:26 1413通常使用以下代码就能导出为流的文件,而不是打开文件 w ... -
C实现urlencode&urldecode
2013-12-28 16:20 6003static unsigned char char_to_he ... -
c语言实现urlencode
2013-12-28 16:19 2043#include <stdio.h> #inc ... -
wifidog+authpuppy认证页面的配置
2013-10-29 02:15 3448转自:http://blog.sina.com.cn/s/ ... -
atoi() & itoa()&atol()<oa()函数的实现
2013-05-01 13:53 3064#include "stdio.h" ... -
详解sigaction --转
2013-04-20 03:31 11369详解sigaction 这是挺好理解的,就好比在系 ... -
Linux定时器的使用 --转
2013-04-20 01:13 1455使用定时器的目的无非是为了周期性的执行某一任务,或者是到了 ... -
Linux C 函数参考(日期时间) --转
2013-04-20 00:03 11449Linux C 函数参考(日期时间) 1.1 概述 世 ... -
对(*(volatile unsigned long *)) 的理解
2013-03-20 15:10 1538对(*(volatile unsign ... -
Linux内核模块概述 --转
2013-01-08 10:43 2448Linux内核模块概述 . Linux 内 ... -
linux上搭建pppoe-server
2012-12-28 15:53 8881记录下过程,主要还是参 ... -
Ubuntu上架设PPPoE Server--转
2012-12-28 01:25 7526一。安裝 PPPoE Server Software ... -
移植rp-pppoe到s3c2440实现ADSL拨号上网--转
2012-12-28 01:22 3250一:总的来说可以分 ... -
Linux下C语言实现文件拷贝--转
2012-11-01 23:11 14009Linux下C语言实现文件拷贝 /* Func ... -
linux操作系统的DNS客户端配置
2012-09-16 16:52 11371基于linux操作系统的DNS客户端配置: Linux ... -
/etc/hosts配置文件解析
2012-06-20 14:46 2543/etc/hosts配置文件解析 这个文件可以配置主机ip及 ... -
移殖net-snmp和应用net-snmp开发详解 -转
2012-06-08 17:46 3571移殖net-snmp和应用net-snmp开发详解 @ ... -
strtok 和strtok_r 的使用
2012-06-01 17:13 106661. strtok介绍众所周知,strtok可以根据用户所提供 ... -
关于LINUX C中函数strtok使用要点
2012-06-01 15:45 2260strtok函数的使用是一个老生常谈的问题了。该函数的作用很大 ...
相关推荐
### Linux库函数getopt详解 #### 一、getopt函数简介 `getopt`是Linux系统中的一个标准库函数,用于解析命令行参数。当编写命令行程序时,经常需要处理用户传递的各种选项和参数。`getopt`提供了一种方便、统一的...
python getopt详解 函数原型: getopt.getopt(args, shortopts, longopts=[]) 参数解释: args:args为需要解析的参数列表。一般使用sys.argv[1:],这样可以过滤掉第一个参数(ps:第一个参数是脚本的名称,它不...
命令行解析函数getopt用法详解 getopt函数是命令行参数解析函数,用于解析命令行参数。它可以将命令行参数解析成选项和操作数,从而使程序能够正确地处理命令行参数。 getopt函数的声明如下: `int getopt(int ...
### `getopt`函数详解 #### 基本概念与语法 `getopt`函数的基本原型如下: ```c extern int getopt(int argc, char *const argv[], const char *optstring); ``` 其中: - `argc`:是命令行参数的数量。 - `argv...
getopt命令用于解析命令行选项,检测给定的选项是否合法。在此命令中,选项部分主要用于影响getopt命令解析选项,其中optstring是需要解析的合法选项的字符串,paramenters通常是一组变量,用于存储从命令行获取的每...
#### getopt函数详解 `getopt`函数的基本原型为: ```c #include extern char *optarg; // 选项的参数指针 extern int optind, // 下一次调用getopt的时,从optind存储的位置处重新开始检查选项。 extern int ...
getopt.getopt(args, shortopts, longopts=[]) 参数解释: args:args为需要解析的参数列表。一般使用sys.argv[1:],这样可以过滤掉第一个参数(ps:第一个参数是脚本的名称,它不应该作为参数进行解析) ...
### C++中的getopt()函数详解 #### 一、引言 `getopt()` 是一个在C和C++中广泛使用的库函数,用于解析命令行参数。它可以帮助开发者轻松地处理用户通过命令行输入的各种选项及其对应的参数。本文将详细介绍 `getopt...
前言 python脚本和shell脚本一样可以获取命令行的参数,根据不同的参数,执行不同的逻辑处理。 通常我们可以通过getopt模块获得不同的执行命令和参数。... opts, args = getopt.getopt(sys.argv[1:], ht:q:,
### 功能详解 1. **短选项处理**:`getopt_long()` 同样可以处理短选项,它们在 `optstring` 字符串中定义。例如,"a:b:cd" 表示选项 `-a` 和 `-b` 需要参数,而 `-c` 和 `-d` 不需要。 2. **长选项识别**:通过 `...
《XGetopt:MFC与Win32的Unix兼容getopt()实现详解》 在Windows开发环境中,尤其是使用MFC(Microsoft Foundation Classes)框架时,开发者可能会遇到一个挑战:如何在不支持原生Unix风格getopt()函数的平台上实现...
python模块详解 各个模块的详解 核心模块 1.1. 介绍 1.2. _ _builtin_ _ 模块 1.3. exceptions 模块 1.4. os 模块 1.5. os.path 模块 1.6. stat 模块 1.7. string 模块 1.8. re 模块 1.9. math 模块 1.10....
本文研究的主要是Python命令行解析...这个模块提供两个函数(getopt.getopt()/getopt.gnu_getopt())和一个参数异常(getopt.GetoptError)。 这里重点介绍getopt.getopt()这个函数。 函数原型:getopt.getopt(args,
8.8.2 PRCO_GETOPT的处理 193 8.9 ip_sysctl函数 193 8.10 小结 194 第9章 IP选项处理 196 9.1 引言 196 9.2 代码介绍 196 9.2.1 全局变量 196 9.2.2 统计量 197 9.3 选项格式 197 9.4 ip_dooptions函数 198 9.5 ...
### H.264代码详解 #### x264源代码解析—x264编码详细文字全过程 本文旨在深入解析H.264视频压缩标准中的x264编码器源代码,通过分析关键函数及其工作流程,帮助读者更好地理解H.264编码原理及其实现细节。 ### ...
8.8.2 PRCO_GETOPT的处理 193 8.9 ip_sysctl函数 193 8.10 小结 194 第9章 IP选项处理 196 9.1 引言 196 9.2 代码介绍 196 9.2.1 全局变量 196 9.2.2 统计量 197 9.3 选项格式 197 9.4 ip_dooptions函数 198 9.5 ...
这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法:sys.argv、...