Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104011
  • 博文数量: 30
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 402
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-22 11:09
个人简介

摸着石头过河

文章分类

全部博文(30)

文章存档

2015年(2)

2014年(28)

我的朋友

分类: C/C++

2015-01-21 09:46:03

        以前写程序不愿意用getopt这个函数,自己写代码处理命令行,处理当然不够好,不用getopt的原因其实是觉得这个函数有点绕,也是懒得学。
最近有时间就专门看了下这个函数介绍,其实基本搞懂了之后还是好用的,至少比自己处理命令行参数强。
       先给出这个函数的原型:
       #include
        int getopt(int argc, char * const argv[],const char *optstring);
       该函数还会用到几个全局变量:
        extern char *optarg;
         extern int optind, opterr, optopt;
       首先这个函数的功能是分析命令行的参数,命令行的参数的作用是什么呢?是对程序的指示和输入一些参数供其使用。
       下面看看介绍下它的参数
        argc和argv就不说了,它们就是main函数的两个参数,optstring这个指针用来指向程序支持的选项集合,如:
         getopt(argc,argv,"c:hf")//表示合法的选项有chf,其中选项c后面跟有:,表示选项c需要参数,而选项h和f则不需要参数。        
       个人认为可将getopt的功能分为两部分:区分选项和参数 、处理选项错误
        一、区分选项和参数
               对于选项需要以-字符开始,如 ./testopt -c 123 -f -h
               每次调用getopt函数就会返回一个选项字符,同时optind赋值为下一个需要处理的字符串的索引。当选项字符扫描完后再调用就会返回-1。
               optarg用于指向,当前getopt返回的那个选项字符的参数,对于./testopt -c 123 -f -h来说,第一次调用getopt会返回字符c,同时
               
optarg指向字符串123,而第二次调用时getopt返回选项字符f,optarg为NULL,第三次调用同第二次。
               getopt对参数的区分并没有那么万能,如./testopt -c 123 -f -h 变为./testopt -fhc123(参数和选项间可以没有空格), 我们多次调用getopt时是可             以正确却区分出选项chf和参数123 的,但是换成这样:./testopt -cfh123 结果就是认为fh123都是选项c的参数。
                 因此:当把多个选项写在一起时(如-fhc123),把必须接参数的选项写在最后面,而存在多个必须接参数的选项时就把这些选项分开写。
          另外,当多次调用getopt结束时,也就是返回-1时,会把argv的参数重新排列,选项全部排在前面,参数排在后面,而且此时optind是第一个参数
          的索引。
         二、处理选项错误
             1、存在不支持的选项
                  当扫描发现非法选项时getopt就会返回?,同时会把optopt赋值为那个非法的选项字符。
             2、必须接参数的选项没有接参数
                   扫描发现必须接参数的选项没有接参数,也会返回?把optopt赋值为那个选项字符。
                  另外,漏加参数时返回?是默认的,也可以配置,如getopt(argc,argv,":c:hf"),最后一个参数的最前面是个:,它的意思就是当出错时返回:                    而不是?但是,这只适用于漏加参数的错误情形,对于非法选项的错误还是返回?。
             全局变量opterr也是用于出错处理的,当opterr非0时会把出错信息打印在stderr上,为0则不会打印,默认是非0,自己可以置为0打印自己的提示               信息。








 
    
        

      


阅读(2112) | 评论(0) | 转发(0) |
0

上一篇:对python变量和对象引用的探讨

下一篇:没有了

给主人留下些什么吧!~~