#include<stdio.h> #include<unistd.h> int main(int argc,char *argv[]) { int ch; opterr=0; while((ch=getopt(argc,argv,"a:b:c:d:e:"))!=-1) { printf("\n\n\n"); printf("optind:%d\n",optind); printf("optarg:%s\n",optarg); printf("ch:%c\n",ch); switch(ch) { case 'a': printf("option a='%s'\n",optarg); break; case 'b': printf("option b='%s'\n",optarg); break; case 'c': printf("option c='%s'\n",optarg); break; case 'd': printf("option d='%s'\n",optarg); break; case 'e': printf("option e='%s'\n",optarg); break; default: printf("other option:%c\n",ch); } printf("optopt+%c\n",optopt); } } // ./a.out -b 2222 -a 1111 -a 3333 -c 4444 -d 5555 -e 6666 /* optarg和optind是两个最重要的external变量。optarg是指向参数的指针(当然这只针对有参数的选项); optind是argv[]数组的索引,众所周知,argv[0]是函数名称,所有参数从argv[1]开始,所以optind被初始化设置指为1。 每调用一次getopt()函数,返回一个选项,如果该选项有参数,则optarg指向该参数。 在命令行选项参数再也检查不到optstring中包含的选项时,返回-1。 optstring是getopt()中第3个参数,作为选项的字符串的列表。 函数getopt()认为optstring中,以'-’开头的字符(注意!不是字符串!!)就是命令行参数选项,有的参数选项后面可以跟参数值。 optstring中的格式规范如下: 1) 单个字符,表示选项, 2) 单个字符后接一个冒号”:”,表示该选项后必须跟一个参数值。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。 3) 单个字符后跟两个冒号”:”,表示该选项后必须跟一个参数。 参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。 */ int main1(int argc, char **argv) { int result; opterr = 0; //使getopt不行stderr输出错误信息 while( (result = getopt(argc, argv, "ab:c::")) != -1 ) { switch(result) { case 'a': printf("option=a, optopt=%c, optarg=%s\n", optopt, optarg); break; case 'b': printf("option=b, optopt=%c, optarg=%s\n", optopt, optarg); break; case 'c': printf("option=c, optopt=%c, optarg=%s\n", optopt, optarg); break; case '?': printf("result=?, optopt=%c, optarg=%s\n", optopt, optarg); break; default: printf("default, result=%c\n",result); break; } printf("argv[%d]=%s\n", optind, argv[optind]); } printf("result=-1, optind=%d\n", optind); //看看最后optind的位置 for(result = optind; result < argc; result++) printf("-----argv[%d]=%s\n", result, argv[result]); //看看最后的命令行参数,看顺序是否改变了哈。 for(result = 1; result < argc; result++) printf("\nat the end-----argv[%d]=%s\n", result, argv[result]); return 0; }
#include<stdio.h>
#include<unistd.h>
int main(int argc,char **argv)
{
int ch;
opterr = 0;
while((ch = getopt(argc,argv,"a:b::cde"))!= -1)
switch(ch)
{
case 'a': printf("option a:'%s'\n",optarg); break;
case 'b': printf("option b:'%s'\n",optarg); break;
default: printf("other option :%c\n",ch);
}
printf("optopt +%c\n",optopt);
}