免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 794 | 回复: 0
打印 上一主题 下一主题

程序参数的控制——getopt [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-07 22:25 |只看该作者 |倒序浏览
  C语言程序由main开始运行,一般main的声明如下:
         int main(int argc,char *argv[])
  argc是参数个数,argv是代表参数自身的字符串数组。
  argv[0]是运行的程序名,后面以此是各个输入的参数,以输入时的空格为界。
  例如:./file a b c,因此argv[0]是file,argv[1]是a,argv[2]是b。
  
  getopt函数能帮助我们很好的操纵程序参数。
  例程:
#include stdio.h>
#include unistd.h>
int main(int argc,char *argv[]){
    int opt;
    while((opt = getopt(argc,argv,"if:lr")) != -1){
        switch(opt) {
            case 'i':
            case 'l':
            case 'r':
                printf("option: %c\n",opt);
                break;
            case 'f':
                printf("filename: %s\n",optarg);
                break;
            case ':':
                printf("option %c needs a value\n",opt);
                break;
            case '?':
                printf("unknown option: %c\n",optopt);
                break;
        }
    }
    for(; optind  argc; optind++)
        printf("argument: %s\n",argv[optind]);
    return 0;
}
输入./opt -i -lr 'hi there' -f opt.c -q
输出:
option: i
option: l
option: r
filename: opt.c
./opt: invalid option -- q
unknown option: q
argument: hi there
int getopt(int argc,char *const argv[],const char *optstring);
前两个参数就是传进main的argc和argv,地三个参数告诉getopt哪些选项可用,哪些选项后要有关联值。如上面的if:lr,表示可选项有iflr,并且f后面有关联值,一个选项后跟一个冒号表示该选项后面有关联值。
应用这个函数要需要知道4个变量:
extern char *optarg
extern int optind,opterr,optopt
optarg里保存选项的关联值,
optind表示下一个待处理参数的索引,每次调用getopt都会返回下一个选项字符,知道最后返回-1。
optopt当有个无法识别的选项时,就保存在此
opterr如果非0,getopt就会向stderr打印出错的信息。
当所有选项都被getopt读取完毕后,optind会指向argv中不是optstring中列出的选项的位置。
argv经过getopt后,顺序会发生改变,如该例子:
本来的argv数组的依次是 ./opt -i -lr 'hi there' -f opt.c -q
经过改变后数组的顺序是 ./opt -i -lr -f opt.c -q 'hi there'
可以看出getopt会先把输入中的选项值依次排列,如果f后必须跟关联值,则该关联值跟在选项后,如opt.c是跟在f后面的,但是其他非选项的值放在数组最后,即使q不是需要的选项。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/62515/showart_491608.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP