main函数参数简介
int main(int argc, char *argv[])
argc:参数的个数,最少为一个,也就是下面示例中"./opt_parse_demo"执行程序的命令。
argv:指针数组首地址,至少放了一个指针argv[0],argv[0]指针指向的字符就是"./opt_parse_demo"。
命令行参数解析函数getopt()
getopt()函数声明
##include <unistd.h>
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
该函数的argc和argv参数通常是直接从main()的参数直接传递而来。optstring是选项字母组成的字符串。如果该字符串里的任一字符后面又冒号,那么这个选项就要求后面带有选项参数。
getopt()所设置的全局变量包括:
1、char *optarg:当前选项参数字符串(如果有选项参数);
2、int optind:argv的当前索引值。当getopt()在while循环中使用时,循环结束后,剩下的字符串视为操作数,在argv[optind]至argv[argc-1]中可以找到。
3、int opterr:这个变量非零时,getopt()函数为“无效选项”或“缺少函数参数选项”,并输出其错误信息。
4、int optopt:当发现无效选项字符时,getopt()函数返回'?'或':'字符,并且optopt包含了所发现的无效选项字符。
代码示例:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int oc; //选项字符
char ec; //无效的选项字符
char *opt_arg; //选项参数字符串
while (-1 != (oc = getopt(argc, argv, "ngl:")))
{
switch (oc)
{
case 'n':
printf("My name is Lyong.\n");
break;
case 'g':
printf("Her name is Xxiong.");
break;
case 'l':
opt_arg = optarg;
printf("Our love is %s\n.", opt_arg);
break;
case '?':
ec = (char)optopt;
printf("Invalid option \'%c\' !", ec);
break;
case ':':
printf("Lack option argv!", ec);
break;
default:
break;
}
}
return 0;
}
测试结果:
$./opt_parse_demo -a
Invalid option 'a' !
$./opt_parse_demo -n
My name is Lyong.
$./opt_parse_demo -g
Her name is Xxiong.
$./opt_parse_demo -l forever
Our love is forever.
$./opt_parse_demo -l
Lack option argv!
$./opt_parse_demo -ngl forever
My name is Lyong.
Her name is Xxiong.
Our love is forever.
Reference:
Linux程序设计——用getopt处理命令行参数