getopt()函数解析命令行选项参数
程序员文章站
2022-07-07 11:19:49
...
#include <unistd.h>
extern char *optarg;//当前选项的参数指针
extern int optind;//下次再次调用getopt时,从optind存储的位置重新可是检查选项
extern int opterr;//当opterr = 0时,getopt不向stderr输出错误信息.
extern int optopt;//当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,该选项存储在optopt中,getopt返回.
主要是介绍optarg与optind
int getopt(int argc,char *const argv[],const char *optstring);
使用以上函数得到文件test.c
/*test.c*/
#include <stdio.h>
#include <unistd.h>
int main(int argc,char **argv)
{
int ch = 0, i = 0;
while((ch = getopt(argc,argv,"ab:c:de::"))!=-1)
{
printf("----------\n");
printf("ch = %c\n",ch);
printf("optind:%d\n",optind);
printf("optarg=%s\n",optarg);
printf("----------\n");
}
printf("::::::optind = %d\n",optind);
for(i = 0;i<optind;i++)
{
printf("argv[%d] = %s)\n",i,argv[i]);
}
printf("////////////////////\n");
for(i = optind;i<argc;i++)
{
printf("argv[%d] = %s)\n",i,argv[i]);
}
return 0;
}
“ab:c:de::” b:说明选项-b后有参数,c:说明选项-c后有参数,e::说明-e与参数之间没有空格。
a与d后面既没有:也没有::说明是这两个选项的后面是不应该有参数的。
当我按照每个选项后都加入参数(这么做当然是错误的)后发现,argv中发生了排序。
那些不应该有参数的选项(例如-a -d)和参数形式错误的参数(例如 -e的参数应该是-eee 但是我中间加入了空格变成了-e ee)以及错误的参数(./test 后的111)后的参数位置都发生了改变。都按照一定的顺序排到了最后.而第一个排到///////////最后的那个坐标由while()循环结束后的optind中保存。
这样由于用户输入错误导致的选项与参数顺序问题就解决了