参数 optstring为选项字符串。如果选项字符串里的字母后接着冒号”:”,则表示还有相关的参数

getopt

int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg; //选项的参数指针
extern int optind; //下一次调用getopt的时,从optind存储的位置处重新开始检查选项
extern int opterr; //当opterr=0时,getopt不向stderr输出错误信息
extern int optopt; //当发现无效选项字符之时,getopt()函数或返回'?'字符,或返回':'字符

举例说明:

getopt(argc, argv, “ab:c:de::”);

  1. 单个字符,表示选项,(如上例中的abcde各为一个选项)
  2. 单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。(如上例中的b:c:)
  3. 单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟。如果跟一个参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(如上例中的e::,如果没有跟参数,则optarg = NULL)

执行:

./a.out -a

例子:

char ch;
while((ch = getopt(argc, argv, "a:b")) != -1)
printf("getopt %c %s\n", ch, optarg);
./a.out: invalid option -- 'c'                  //输入不存在的选项
./a.out: option requires an argument -- 'a' //a 需要有参数

getopt_long

int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
struct option
{
const char *name; //长参数
int has_arg;
int *flag;
int val;
};

name:长参数名(–name)

has_arg:

no_argument(0)-长参数不带参数

required_argument(1)-长参数必须带参数

optional_argument(2)-长参数后面带的参数是可选

flag:当这个指针为空的时候,函数直接将val的数值从getopt_long的返回值返回出去;当它非空时,val的值会被赋到flag指向的整型数中,而函数返回值为0

val:指定函数找到该选项时的返回值,或者当flag非空时指定flag指向的数据的值

longindex:如果longindex非空,它指向的变量将记录当前找到参数符合longopts里的第几个元素的描述,即是longopts的下标值

strtoul

将nptr字符串转换成无符号的长整型数

unsigned long int strtoul(const char *nptr, char **endptr, int base);

base:从2至36,或0

10-10进制

16-16进制

0-如果第一个字符是’0’,就判断第二字符如果是’x’则用16进制,否则用8进制;第一个字符不是’0’,则用10进制

endptr:若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回

getopt、getopt_long命令参数的更多相关文章

  1. 函数参数选项的处理getopt getopt_long getopt_long_only

    转载:http://blog.chinaunix.net/uid-20321537-id-1966849.html   在头文件中int getopt(int argc,char *argv[], c ...

  2. 命令行解析函数:getopt/getopt_long

    参考: http://blog.csdn.net/zhangyang0402/article/details/5671410 http://www.cnblogs.com/gnuhpc/archive ...

  3. python通过getopt模块获取执行命令参数

    python脚本和shell脚本一样可以获取命令行的参数,根据不同的参数,执行不同的逻辑处理. 通常我们可以通过getopt模块获得不同的执行命令和参数. 下面我通过新建一个test.py的脚本解释下 ...

  4. 使用 getopt 处理命令行长参数

    getopt命令并不是bash的内建命令,它是由util-linux包提供的外部命令. getopt 与 getopts 的区别 getopts 是 shell 内建命令, getopt 是一个独立外 ...

  5. getopt:命令行选项、参数处理

    在写shell脚本时经常会用到命令行选项.参数处理方式,如: ./test.sh -f config.conf -v --prefix=/home -f 为短选项,它需要一个参数,即config.co ...

  6. Python3+getopt解析命令行参数

    一.说明 在学C语言的时候就知道可以通过argc获取命令行参数个数,可以通过argv获取具体参数.但自己写的程序获取到的参数一是没有键值形式二是写的参数不能乱序,和系统命令不太一样. 再往后点知道有g ...

  7. 如何使用getopt()函数解析参数

    最近在写程序的过程中,把一部分时间都花费在程序对参数的处理上.今天听了学长说到getopt函数,才发现原来c里面还有一个专门解决参数处理的函数,查询了相关资料,这里简单总结一下. 使用int main ...

  8. 使用 getopt() 进行命令行处理

    引言 在早期的 UNIX® 中,其命令行环境(当时的唯一用户界面)包含着数十种小的文本处理工具.这些工具非常小,通常可很好地完成一项工作.这些工具通过较长的命令管道链接在一起,前面的程序将其输出传递给 ...

  9. python 使用getopt 获取配置参数

    在工程中特别是稍微大一点的项目基本上都会用到配置,就会涉及到配置文件的读取,配置参数的读取. 常用的解析配置文件的是configParser,解析命令行参数的则为getopt. getopt的参数可以 ...

随机推荐

  1. sqlserver查询是否阻塞

    查询当前正在执行的语句 SELECT der.[session_id],der.[blocking_session_id], sp.lastwaittype,sp.hostname,sp.progra ...

  2. 详解TCP与UDP

    一.TCP的特点 面向连接的.可靠的.基于字节流的传输层通信协议. 将应用层的分割成报文段,并发送发给目标节点的TCP层. 数据包都有序号,对方收到则发送ACK确认,未收到则重传. 使用效验和来效验数 ...

  3. C++踩坑——用memset对vector进行初始化

    在一段程序中,使用memset对vector进行了初始化,然后得到了错误的结果.找这个bug花费了很长时间. vector中有其自身的结构,不能单纯的按字节进行初始化.使用memset对vector进 ...

  4. PHP 自动加载

    回顾 开始的时候, 如果想在一个php文件中使用其它文件的类或方法, 需要通过include/require方法将文件包含进来. 这种方法的缺点也很明显: 如果需要引入很多文件, 就需要很多的incl ...

  5. 初学JavaScript正则表达式(六)

    JavaScript预定义类 ab+数字+任意字符 ab[0-9][^\r\n] 等价于 ab\d. '@123@abc@'.replace(/@./g,'Q') Q23Qbc@ 将"@加任 ...

  6. Pwn-pwn-100

    题目地址http://www.whalectf.xin/files/2779dd8a2562a1d5653c5c6af9791711/binary_100 32位 ,没有防护 上IDA 很简单的栈溢出 ...

  7. TestNG.xml 配置

    <packages>表示以测试类所在的包的方式定义测试用例,包中的所有测试类都被涉及,粒度较大. <?xml version="1.0" encoding=&qu ...

  8. Log日志级别从高到低排序 ERROR、WARN、INFO、DEBUG

    Log4j建议只使用四个级别,优先级从高到低分别是 ERROR.WARN.INFO.DEBUG.通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关.比如在这里定义了INFO级别,则应 ...

  9. JDOJ3007 铺地板I

    JDOJ3007 铺地板I https://neooj.com/oldoj/problem.php?id=3007 题目描述 有一个大小是 2 x N(1 <= N <= 105)的网格, ...

  10. java创建泛型的实例

    如果存在泛型 T ,要创建它的实例,以下方式行不通 public class xxx { privaye E[] data ; public xxx() { data = new E[10] ; } ...