在学习webbench这个开源小项目时遇到了getopt_long()这个函数,就转查到了getopt()这个函数,功能基本一致。

函数参数和返回值

int getopt(int argc, char * const argv[], const char *optstring);
说一下什么是选项,什么是参数。
argc和argv就不说了, 这个就是在命令行输入时的选项,通过main函数的参数传入

字符串optstring可以下列元素:

  1. 单个字符,表示选项,
  2. 单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
  3. 单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给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。
#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的用法相关推荐

  1. optarg与getopt的用法

    optarg与getopt的用法 这里是我遇到的问题,不想看的,可直接跳过,去下面看解释 前言: 今天在一个项目里的iReadOptions(int argc, char **argv)函数里遇到ex ...

  2. getopt的用法与optarg

    getopt的用法与optarg 2014-03-06 20:14 2084人阅读 评论(0) 收藏 举报 分类: Mac开发(29) getopt被用来解析命令行选项参数.就不用自己写东东处理arg ...

  3. linux getopt命令,Linux中getopt函数用法

    最近做cache lab 用到了getopt函数, 用man 3 getopt查看了下用法, 做个总结. 描述:getopt函数是用来解析命令行参数的, 以'-'或'--'开头的参数为选项元素,除去' ...

  4. linux getopt函数,Linux中getopt函数用法

    最近做cache lab 用到了getopt函数, 用man 3 getopt查看了下用法, 做个总结. 描述:getopt函数是用来解析命令行参数的, 以'-'或'--'开头的参数为选项元素,除去' ...

  5. php getopt不好使,深入php中getopt的用法详解

    在php中,getop是用于接收cmd参数的. 例如,当在linux中用php调用时,往往需要带参数调用. 那么,在php编程中使用getopt,即可实现带参数传入的命令. 使用方式: array g ...

  6. Unix/Linux中Cron的用法

    cron是unix或者linux下用来定时任务的命令,大致的用法如下: 1.服务的启动和关闭 /sbin/service crond start   //启动服务 /sbin/service cron ...

  7. perl模块Getopt::Std用法及实例-从命令行读取参数模块

    Getopt::Std模块的使用: 初始设置: 在程序中加入如下代码: use Getopt::Std; use vars qw($opt_d $opt_f $opt_p); getopts('d:f ...

  8. Python 参数传入sys.argv和getopt.getopt()的用法

    1.sys.argv Python中sys.argv是命令行参数从程序外部传值的的一种途径,它是一个列表,列表元素是我们想传进去的的新参数,所以可以用索引sys.argv[]来获得想要的值.因为一个写 ...

  9. java getopt_sys.argv和getopt.getopt()的用法

    Python中sys.argv是命令行参数从程序外部传值的的一种途径,它是一个列表,列表元素是我们想传进去的的新参数,所以可以用索引sys.argv[]来获得想要的值.因为一个写好的程序一般封装好了, ...

最新文章

  1. 如何实现两个路由下的电脑互相访问
  2. js运算符单竖杠“|”的用法和作用及js数据处理
  3. 从流程上对rtmp协议经行总结
  4. 18桥图片_世界上第一台70米泵车,采用10桥底盘,泵送速度可达200m/h
  5. 【VS开发】这就是COM组件
  6. 在JScript中运行应用程序
  7. 数据结构笔记(六)-- 双向链表
  8. qt中文显示乱码问题
  9. java nio 追加写文件_java.nio.file读写文件
  10. 【笑话】男生追女生的数学模型
  11. janusgraph源码分析1-下载编译启动
  12. Ubuntu安装无线网卡驱动
  13. Visual studio 2019 报错没有“dirent.h”文件
  14. 简述轻量级与重量级(框架,应用,组件)
  15. css_解决浏览器显示盒子的实际像素和你设置的像素不一致的问题;
  16. (40)STM32——OV2640摄像头实验
  17. pip install psycopg2报错
  18. android township 游戏存档备份,游戏闪退存档全没了?不要怕,可以这样备份与还原游戏存档!...
  19. 运算放大器(一)简介
  20. 什么是配煤?为什么要配煤?

热门文章

  1. assets bitmap 转_图片文件和Bitmap之间的转换
  2. scatter python_Python scatter详解
  3. CMake中的ARGC ARGV 和ARGN参数意义
  4. torch.backends.cudnn.benchmark--提升卷积神经网络的运行速度
  5. Python zip() 函数--多个迭代器取元素组合成一个新的迭代器
  6. MySql-phpMyAdmin
  7. python网络框架生产环境_配置Django框架为生产环境的注意事项(DEBUG=False)
  8. python怎么用split字符串全部分开_请教一下python怎么用split对一句话拆分两次?...
  9. 吴恩达 神经网络和深度学习 第一课 第一周(笔记,代码,数据集)
  10. js获取图片真实尺寸 - 代码篇