程序参数解析

C++程序都是通过main函数启动的,大部分的程序都是支持输入参数

那么这些参数怎么获取?也就是说你后续程序该如何知道用户输入。

常见做法,如下:

kill -9 911   //kill是进程名称,-9 以及 911是执行参数
killall xxx   //killall 是进程名称,xxx是执行参数
ls -l         //ls 是进程名称,-l是执行参数
cp --help
.....  很多,复杂点还有多种组合

总的来说,就这么几种

-参数 +输入项

例如 -9 911 其中911必须输入

直接输入项

如killall xxx ,xxx必须输入

-参数 但不需要输入项

如 ls -l

--参数,这个参数不再是一个字符,是个字符串

如 --version --help

那么,我们程序,怎么处理这些呢?

此时需要用到一个函数:getopt,原型如下:

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

前面两个参数都很好理解,就是main输入参数,一模一样。

argc 是表示有多少参数,包含当前进程。也就是说,不带任何参数,argc==1

argv 就是具体参数内容

举个实际例子:

static void usage(FILE * out) 
{
    fprintf(out,"usage:\t\t\t\t\t\t\t\t\t\t\t\n"
                   "-r [option] recover config!! \t\n"
                   "\n\n\n");
}

int main(int argc, char *argv[])
{
    /doing    
    int32_t ch = -1;
    while ((ch = getopt(argc,argv,"rR")) != -1)
    {
        switch(ch)
        {
            case 'R':
            case 'r':
                mode = MainWindow::RECOVER_CFG; //执行 Upgrade -r 进入此项
                break;

            default:
                fprintf(stderr,"(%s:%d) won't support option %c\n\n",__FILE__,__LINE__,ch);
                usage(stderr);
                break;
        }
    }

    
    return 0;
}

假设最终编译进程名 为Upgrade

那么,此时 运行 Upgrade -r 就能

这里重点其实,就是怎么过滤参数,有哪些规则:

参数

过滤

-9 911

getopt(argc,argv,"9:")

一个冒号的意思,就是必须输入项

xxx

不用getopt

-l

getopt(argc,argv,"l")

--help

可带参数或不带

getopt(argc,argv,"i::")

两个冒号的就表示这个选项的参数是可选的,即可以有参数,也可以没有参数,但要注意有参数时,参数与选项之间不能有空格(有空格会报错的哦),这一点和一个冒号时是有区别的。

posted @ 2023-02-07 18:09  小刚学长  阅读(139)  评论(0编辑  收藏  举报