在linux中通常通过操作命令去完成日常任务,而这个命令其实就是一个工具程序,使用工具时可以通过指定选项去选择某些功能,例如查看文件列表操作ls -l
。下面记录一个例子实现工具程序的参数解析功能。
函数参数
标准写法的主函数有两个参数,其中argc
表示参数个数, argv
表示字符串参数数组。鉴于需要参数分析,所以首先就可以排除掉不带参数的情况。
int main(int argc, char **argv)
{
if (argc < 2)
return -1;
return 0;
}
输入说明
任何工具都应该有一个操作说明来提示用户具体的操作,一般情况下它只有在输入错误时才被打印出来。以常见的单选项和选项附带值两类参数为例,定义以符号-
指定选项,其中除-b
选项外-h
和-d
不需要选项值。
void help(char **argv)
{
printf("usage: %s [-h] [-b file] [-d]\n", argv[0]);
printf(" -h : display usage\n");
printf(" -b file : dump Mass Storage data to file 'file'\n");
printf(" -d : enable debug output\n");
}
选项探测
首先选项是以-
开头并且连着至少一个字符,当匹配到选项时循环继续。当选项需要值时,当前参数位置一定不是最后一个,并且下一个参数是以-
k开头的。
int check(int argc, char **argv)
{
int j;
size_t arglen;
bool flg_debug = false;
bool flg_binary = false;
bool flg_help = false;
const char *binary_name = NULL;
for (j = 1; j < argc; j++)
{
arglen = strlen(argv[j]);
if ((argv[j][0] == '-') && (arglen >= 2))
{
switch (argv[j][1])
{
case 'd':
flg_debug = true;
break;
case 'b':
if ((j + 1 >= argc) || (argv[j + 1][0] == '-'))
{
flg_help = true;
break;
}
binary_name = argv[++j];
flg_binary = true;
break;
default:
flg_help = true;
break;
}
}
else
flg_help = true;
if (flg_help)
{
help(argv);
break;
}
}
return 0;
}