linux之getopt函数,C语言学习笔记之getopt()

接下来,我们逐一来解读getopt()在这段程序中如何工作的。

while ((ch = getopt(argc,argv,"d:t")) != EOF )

1、首先我们采用循环来获取getopt函数的返回值,直到命令行结尾,因为getopt函数没有选项处理时,是返回-1。

2、getopt()函数中的"d:t",代表d和t是有效选项,同时d后面是有选项参数的,它寄存在optarg这个变量里面。

switch (ch){

case 'd':

delivery = optarg;

break;

case 't':

thick = 1;

break;

default:

fprintf(stderr,"Unknown option:'%s'\n",optarg);

1、这一段很简单明了了吧,采用switch处理我们的命令行参数,是d的时候,就把寄存在变量optarg中的选项参数赋值给delivery。

2、default,默认当我们匹配不上有效的命令行参数的时候,我们就把它输出到标准错误。

argc -= optind;

argv += optind;

上面这两个,可能不太好理解,因为我们需要先弄清楚getopt()这个函数的内部工作原理。

getopt()的函数声明:int getopt(int argc,char * const argv[ ],const char * optstring);

getopt是从argv[1]到argv[argc-1]进行逐一处理的,它会把选项和选项参数依次放到argv数组的最左边去,以此把其他命令行参数放到argv数组中选项和选项参数的后面去。举个例子,如果开始输入的命令是 ./order_pizza -t Anchovies Pineapple -d now ,argv[]数组会依次接收他们的值并进行存放,但是getopt函数在处理完成后,此时argv[]数组里面的顺序是["/order_pizza" , "-t" , "-d" , "now" , "Anchovies" ,"Pineapple"]

optind这个变量则保存了读取了几个选项和选项参数,初始化是1,所以如果读取了3个选项和选项参数,则getopt函数处理完成以后,optind的值是4。

ok,现在回过头来看上面的argc -= optind;和argv += optind; 它的意思是,在getopt函数处理完成后,让我们跳过已经处理过的命令行选项和选项参数,所以此时的argc=2,而argv需要前进4位(数组地址变动)。

if (thick)

puts("Thick crust.");

if (delivery[0])

printf("To be delivered %s.\n",delivery);

puts("Ingredients:");

for (count=0;count

puts(argv[count]);

这上面的代码就很简单了,基本不用我们解释了。

补充,是关于getopt函数声明中,对optstring这个参数的处理:

1) 单个字符,表示选项。

2) 单个字符后接一个冒号”:”,表示该选项后必须跟一个选项参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。

3) 单个字符后跟两个冒号”:”,表示该选项后必须跟一个选项参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(这个特性是GNU的扩展)。

另外,还有optopt和opterr这些变量,不过上面的已经足够我们理解getopt()这个函数的核心了。

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值