Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59961
  • 博文数量: 16
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 185
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 20:05
文章分类
文章存档

2008年(16)

我的朋友

分类: LINUX

2008-03-07 22:25:49

  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不是需要的选项。





阅读(886) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~