C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
  • 基础

    • C++ 基础 - 学习路线
    • C++ 基础 - 知识点
    • C++ 基础 - 面向对象
    • C++ 基础 - 语法糖
    • C++ 基础 - 关键字
    • C++ 基础 - 常用宏定义
    • C++ 基础 - 宏函数、内联函数、普通函数
  • 函数

    • C++ 函数 - 闭包
    • C++ 函数 - Linux系统调用Hook
    • C++ 函数 - getopt函数分析以及命令行解析
    • C++ 函数 - 函数指针及其应用
    • C++ 函数 - 作用域运算符::的使用
    • C++ 函数 - 智能指针shared_ptr的使用
    • C++ 函数 - struct结构体学习
    • C++ 函数 - typedef 语句的使用
    • C++ 函数 - va_list函数学习
  • 知识点

    • C++ 知识点 - 写时拷贝技术(copy-on-write)
    • C++ 知识点 - 前向声明(forward declaration)
    • C++ 知识点 - 头文件.h 和 源文件.cpp 以及多重定义(multiple definition)
    • C++ 知识点 - 为什么C语言不支持函数重载,C++又是如何支持的
    • C++ 知识点 - return 局部变量
    • C++ 知识点 - linux下c/cplusplus头文件和动态库的搜索
    • C++ 知识点 - 模板特化与偏特化
  • IO框架

    • C++ IO框架 - I/O 复用
    • C++ IO框架 - select 函数
    • C++ IO框架 - poll 函数
    • C++ IO框架 - epoll 函数
    • C++ IO框架 - Reactor 和 Proactor
  • 新版本特性

    • C++ 新版本特性 - C++11
    • C++ 新版本特性 - C++14
    • C++ 新版本特性 - C++17
    • C++ 新版本特性 - C++20

C++函数 - getopt函数分析以及命令行解析

在Linux下运行可执行程序时,一般需要带特定参数以指定运行的方式。通过是采用getopt()函数解析传入的参数内容,其头文件为<unistd.h>。

    下面来具体介绍getopt的原型:

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

    参数argc和argv分别代表参数个数和内容,参数 optstring为选项字符串。

    getopt() 所设置的全局变量包括:

    • extern char *optarg;
    • extern int optind, opterr, optopt;
    • optarg——指向当前选项参数(如果有)的指针。
    • optind——再次调用 getopt() 时的下一个 argv 指针的索引。
    • opterr——是否将错误信息输出到stderr,为0时表示不输出。
    • optopt——不在选项字符串optstring中的选项。

    选项和参数的概念:

    • 单个字符,表示选项;(例如 g++ -o main main.cpp -std=c++11,其中o就是命令行的选项,而后面的main就是选项所带的参数。)
    • 单个字符后接一个冒号: 表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
    • 单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。

    短参数的定义:

    getopt()使用optstring所指的字串作为短参数列表,像"1ac:d::"就是一个短参数列表。短参数的定义是一个'-'后面跟一个字母或数字,例如-a, -b就是一个短参数。每个数字或字母定义一个参数。

    其中短参数在getopt定义里分为三种:

    1. 不带值的参数,它的定义即是参数本身。  2. 必须带值的参数,它的定义是在参数本身后面再加一个冒号。  3. 可选值的参数,它的定义是在参数本身后面加两个冒号 。

    以"1ac:d::"为例,其中的1,a就是不带值的参数,c是必须带值的参数,d是可选值的参数。   在实际调用中,'-1 -a -c cvalue -d', '-1 -a -c cvalue -ddvalue', '-1a -ddvalue -c cvalue'都是合法的。注意事项:

    1. 不带值的参数可以连写,像1和a是不带值的参数,它们可以-1 -a分开写,也可以-1a或-a1连写。  2. 参数不分先后顺序,'-1a -c cvalue -ddvalue'和'-d -c cvalue -a1'的解析结果是一样的。  3. 要注意可选值的参数的值与参数之间不能有空格,必须写成-ddvalue这样的格式,如果写成-d dvalue这样的格式就会解析错误。

    测试程序1,解析输入的ip,port和msg:

    1. 类的this可以通过对象或者指针来绑定

    测试程序1:

    详情
    #include <iostream>
    #include <unistd.h>
    #include <string>
    
    using namespace std;
    
    //解析ip, port, msg.
    void testFun1(int argc, char *argv[])
    {
        std::string ip = "127.0.0.1";
    	int port = 8080;
    	std::string msg = "Hello World";
    	
    	int opt;
        const char *str = "i:p:m:";
        while ((opt = getopt(argc, argv, str)) != -1)
        {
            switch (opt)
            {
            case 'i':
            {
                ip = optarg;
                break;
            }
            case 'p':
            {
                port = atoi(optarg);
                break;
            }
            case 'm':
            {
                msg = optarg;
                break;
            }
            default:
                break;
            }
        }
    	cout<<"ip: "<<ip<<endl;
    	cout<<"port: "<<port<<endl;
    	cout<<"msg: "<<msg<<endl;
    }
    
    //解析2ab:c:de::
    void testFun2(int argc, char *argv[])
    {
    
    	int opt;
        const char *str = "2ab:c:de::";
        while ((opt = getopt(argc, argv, str)) != -1)
        {
            switch (opt)
            {
                case '2':
    				cout<<"HAVE option: -2"<<endl;
                    break;
    			case 'a':
    				cout<<"HAVE option: -a"<<endl;
                    break;
                case 'b':
                    cout<<"HAVE option: -b"<<endl;
    				cout<<"The value of -b is "<<optarg<<endl;
    				break;
    			case 'c':
    				cout<<"HAVE option: -c"<<endl;
                    cout<<"The value of -c is "<<optarg<<endl; 
                    break;
                case 'd':
                    cout<<"HAVE option: -d"<<endl;
    				 break;
    			case 'e':
    				cout<<"HAVE option: -e"<<endl;
                    cout<<"The value of -e is "<<optarg<<endl;
                    break;
    			default:
    				break;
            }
        }
    }
    
    int main(int argc, char *argv[])
    {
    	//testFun1(argc,argv);
    	testFun2(argc,argv);
        return 0;
    }
    
    
    

    执行结果: bash

    [root@192 main函数命令行解析]# ./main
    ip: 127.0.0.1
    port: 8080
    msg: Hello World
    [root@192 main函数命令行解析]# ./main -i 10.43.33.115 -p 8888 -m Test
    ip: 10.43.33.115
    port: 8888
    msg: Test
    

    测试程序2,解析输入的"abcde":

    执行结果:

    [root@192 main函数命令行解析]# ./main -a -b 123 -c 456 -d -e 555
    HAVE option: -a
    HAVE option: -b
    The value of -b is 123
    HAVE option: -c
    The value of -c is 456
    HAVE option: -d
    HAVE option: -e
    The value of -e is [root@192 main函数命令行解析]# ./main -b 123 -c 456 -d -e555 -a2
    HAVE option: -b
    The value of -b is 123
    HAVE option: -c
    The value of -c is 456
    HAVE option: -d
    HAVE option: -e
    The value of -e is 555
    HAVE option: -a
    HAVE option: -2
    
    Last Updated:
    Contributors: klc407073648
    Prev
    C++ 函数 - Linux系统调用Hook
    Next
    C++ 函数 - 函数指针及其应用