程序参数解析
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::") | 两个冒号的就表示这个选项的参数是可选的,即可以有参数,也可以没有参数,但要注意有参数时,参数与选项之间不能有空格(有空格会报错的哦),这一点和一个冒号时是有区别的。 |
满屏源代码,一把辐射泪,都云编程痴,谁解其中味!