Unix——optarg与getopt的用法
在学习webbench这个开源小项目时遇到了getopt_long()这个函数,就转查到了getopt()这个函数,功能基本一致。
函数参数和返回值
int getopt(int argc, char * const argv[], const char *optstring);
说一下什么是选项,什么是参数。
argc和argv就不说了, 这个就是在命令行输入时的选项,通过main函数的参数传入
字符串optstring可以下列元素:
- 单个字符,表示选项,
- 单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(这个特性是GNU的扩张)。
- getopt处理以’-’开头的命令行参数,如optstring=”ab:c::d::”,命令行为
getopt.exe -a -b host -ckeke -d haha
- 在这个命令行参数中,-a和-h就是选项元素,去掉’-‘,a,b,c就是选项。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。
- getopt处理以’-’开头的命令行参数,如optstring=”ab:c::d::”,命令行为
#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]就能得到下个字符串,通过判断是否以 ‘-‘开头就可。下面是个测试程序
#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++;}elsebreak;}printf("\n");}getchar();}
再来讲我自己遇到的东西
先看代码:
#include <stdio.h>
#include <unistd.h>int main(int argc, char *argv[]){char res;try{res = getopt(argc, argv, "a:b");switch (res){case 'a':printf("option:a,optarg:%s\n", optarg);break;case 'b':printf("option:b\n");break;default:printf("res:%c\n", res);printf("optopt:%c\n", optopt);break;}}catch (...){printf("error!\n");}
}
再看测试输出
Unix——optarg与getopt的用法相关推荐
- optarg与getopt的用法
optarg与getopt的用法 这里是我遇到的问题,不想看的,可直接跳过,去下面看解释 前言: 今天在一个项目里的iReadOptions(int argc, char **argv)函数里遇到ex ...
- getopt的用法与optarg
getopt的用法与optarg 2014-03-06 20:14 2084人阅读 评论(0) 收藏 举报 分类: Mac开发(29) getopt被用来解析命令行选项参数.就不用自己写东东处理arg ...
- linux getopt命令,Linux中getopt函数用法
最近做cache lab 用到了getopt函数, 用man 3 getopt查看了下用法, 做个总结. 描述:getopt函数是用来解析命令行参数的, 以'-'或'--'开头的参数为选项元素,除去' ...
- linux getopt函数,Linux中getopt函数用法
最近做cache lab 用到了getopt函数, 用man 3 getopt查看了下用法, 做个总结. 描述:getopt函数是用来解析命令行参数的, 以'-'或'--'开头的参数为选项元素,除去' ...
- php getopt不好使,深入php中getopt的用法详解
在php中,getop是用于接收cmd参数的. 例如,当在linux中用php调用时,往往需要带参数调用. 那么,在php编程中使用getopt,即可实现带参数传入的命令. 使用方式: array g ...
- Unix/Linux中Cron的用法
cron是unix或者linux下用来定时任务的命令,大致的用法如下: 1.服务的启动和关闭 /sbin/service crond start //启动服务 /sbin/service cron ...
- perl模块Getopt::Std用法及实例-从命令行读取参数模块
Getopt::Std模块的使用: 初始设置: 在程序中加入如下代码: use Getopt::Std; use vars qw($opt_d $opt_f $opt_p); getopts('d:f ...
- Python 参数传入sys.argv和getopt.getopt()的用法
1.sys.argv Python中sys.argv是命令行参数从程序外部传值的的一种途径,它是一个列表,列表元素是我们想传进去的的新参数,所以可以用索引sys.argv[]来获得想要的值.因为一个写 ...
- java getopt_sys.argv和getopt.getopt()的用法
Python中sys.argv是命令行参数从程序外部传值的的一种途径,它是一个列表,列表元素是我们想传进去的的新参数,所以可以用索引sys.argv[]来获得想要的值.因为一个写好的程序一般封装好了, ...
最新文章
- 如何实现两个路由下的电脑互相访问
- js运算符单竖杠“|”的用法和作用及js数据处理
- 从流程上对rtmp协议经行总结
- 18桥图片_世界上第一台70米泵车,采用10桥底盘,泵送速度可达200m/h
- 【VS开发】这就是COM组件
- 在JScript中运行应用程序
- 数据结构笔记(六)-- 双向链表
- qt中文显示乱码问题
- java nio 追加写文件_java.nio.file读写文件
- 【笑话】男生追女生的数学模型
- janusgraph源码分析1-下载编译启动
- Ubuntu安装无线网卡驱动
- Visual studio 2019 报错没有“dirent.h”文件
- 简述轻量级与重量级(框架,应用,组件)
- css_解决浏览器显示盒子的实际像素和你设置的像素不一致的问题;
- (40)STM32——OV2640摄像头实验
- pip install psycopg2报错
- android township 游戏存档备份,游戏闪退存档全没了?不要怕,可以这样备份与还原游戏存档!...
- 运算放大器(一)简介
- 什么是配煤?为什么要配煤?
热门文章
- assets bitmap 转_图片文件和Bitmap之间的转换
- scatter python_Python scatter详解
- CMake中的ARGC ARGV 和ARGN参数意义
- torch.backends.cudnn.benchmark--提升卷积神经网络的运行速度
- Python zip() 函数--多个迭代器取元素组合成一个新的迭代器
- MySql-phpMyAdmin
- python网络框架生产环境_配置Django框架为生产环境的注意事项(DEBUG=False)
- python怎么用split字符串全部分开_请教一下python怎么用split对一句话拆分两次?...
- 吴恩达 神经网络和深度学习 第一课 第一周(笔记,代码,数据集)
- js获取图片真实尺寸 - 代码篇