原创文章,转载请正确注明本文原始URL及作者。

介绍

写C/C++程序,我们常常需要把main函数的参数作为选项来传递。在linux中,解析选项有专门的函数可以用。

int getopt(int argc,char * const argv[ ],const char * optstring);

getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。
参数optstring 则代表你想要处理的选项字符串。
此函数处理的是短格式的选项,像"-a"这样只有一个字母的就是选项。
此函数会返回在argv 中下一个的选项字母,此字母会对应参数optstring 中的一个字母。
如果选项字符串里的字母后接着冒号":",则表示此选项还有相关的参数,全域变量optarg 即会指向此额外参数。
如果getopt()发现有optstring以外的选项,则返回字符'?'并用全域变量optopt接收该未知选项,并且打印出错信息。如果不希望getopt()打印出错信息,则只要将全域变量opterr设为0即可。
这里涉及到三个全局变量: optarg optopt opterr

演示一下

 #include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int ch;
opterr = ;
while ((ch = getopt(argc,argv,"c:dls"))!=-)
{
switch(ch)
{
case 'c':
printf("config:%s\n",optarg);
break;
case 'd':
printf("debug mode\n");
break;
case 'l':
printf("print log\n");
break;
case 's':
printf("print status\n");
break;
default:
printf("ch=%c,unknown option :%c\n",ch,optopt);
}
}
printf("opterr=%d\n",opterr);
}

传参测试一下,运行结果如下:

test@localhost:~$ ./a.out -lsd -c hello.ini -AB
print log
print status
debug mode
config:hello.ini
ch=?,unknown option :A
ch=?,unknown option :B

 

我参考了这个资料,但其中有点错误,他把optopt说反了。

原创文章,转载请正确注明本文原始URL及作者。

解析main函数的命令行参数的更多相关文章

  1. C++main函数与命令行参数,退出程序

    本文翻译自:https://docs.microsoft.com/en-us/cpp/cpp/main-function-command-line-args?view=vs-2019 (除动态链接库d ...

  2. Unix系统编程()main函数的命令行参数

    命令行参数输入双引号是什么效果? 好像可以去空格化.

  3. 第33课 main函数与命令行参数

    main函数的概念: 测试程序: 以上四种定义main函数的方法都是正确的. main函数的本质: 操作系统是希望main函数的有返回值的,这样可以知道main函数的退出状态. 如果程序时异常退出的, ...

  4. C++-main函数与命令行参数

    1.main函数的概念 C语言中main函数称之为主函数 —个C程序是从main函数开始执行的 下面的main函数定义正确吗? //1 main(){ } //2 void main(){ } //3 ...

  5. main函数与命令行参数

    main函数的概念 C语言中main函数称之为主函数 一个c程序从main函数开始执行的 下面的main函数定义正确吗? main函数的本质 main函数是操作系统调用的函数 操作系统总是将main函 ...

  6. Java的main函数(命令行传参)

    javac :编译命令 java  :执行命令

  7. [笔记] 命令行参数 int main(int argc,char *argv[])

    int main(int argc,char *argv[]) // argument count 变量个数 argument values 变量值 C程序的main函数有两个形参* argc:整数, ...

  8. Go 命令行参数,JSON 序列化与反序列化

    #### Go 命令行参数,JSON 序列,反序列化这一节来学习一下Go 如果解析命令行参数,以及JSON 的序列化及反序列化; 命令行参数对于熟悉Linux 的同学来说比较清楚,如: ls -a , ...

  9. getopt_long函数解析命令行参数

    转载:http://blog.csdn.net/hcx25909/article/details/7388750 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用 ...

随机推荐

  1. 查AIX 版本和系统参数

    查AIX版本 atii:[/home/pmts]oslevel -s 7100-01-07-1316 即AIX 7.1版本atii:[/home/pmts]lsdev -C 查CPU个数 (逻辑数目) ...

  2. Ubuntu 14.10 下安装伪分布式hdoop 2.5.0

    折腾了一天,其间配置SSH时候出现了问题,误删了ssh-keygen相关文件,导致配置SSH彻底萎了,又重装了系统.... 采用伪分布式模式,即hadoop将所有进程运行于同一台主机上,但此时Hado ...

  3. IRQL Ring0实现

    一,IRQL的定义Interrupt ReQuest Level     DDK对IRQL的定义是:中断请求级(IRQL)标示中断的优先级.处理器在一个IRQL上执行线程代码,IRQL是帮助决定线程如 ...

  4. switch语句的功能是否完全可以使用if else多选择结构来代替?如果是,为什么还需要switch结构?

  5. SpringMVC之HandlerAdapter解析

    HandlerAdapter字面上的意思就是处理适配器,它的作用用一句话概括就是调用具体的方法对用户发来的请求来进行处理.当handlerMapping获取到执行请求的controller时,Disp ...

  6. HBase 集群部署

     前提条件:hadoop及zookeeper机群已经搭建好. 配置hbase集群步骤: 1.配置hbase集群,要修改3个文件 注意:要把hadoop的hdfs-site.xml和core-site. ...

  7. MySQL存储过程中使用SELECT …INTO语句为变量赋值

    使用SELECT …INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量.SELECT …INTO语句 ...

  8. 升级Android Studio到1.0.2的问题解决

    当前从光网下载到的Android Studio的版本是1.0.1,升级到1.0.2大概是3M的升级包.升级很简单,点击Help--Check For Update... 可是我碰到的情况是提示:Con ...

  9. KVM CPU线程等学习记录

    绝大多数操作系统调度单位是线程.线程是调度和分配的基本单位,进程是资源拥有的基本单位.linux下fork的叫进程pthread叫线程创建进程比线程性能要差好多5-100倍,因进程不同而异.进程之间共 ...

  10. Nginx 之防盗链配置

    首先,我们需要知道通过什么来实现防盗的! http referer 是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上referer,这是在告诉服务器是从哪个页面链接过来的,服务 ...