Chinaunix首页 | 论坛 | 博客
  • 博客访问: 391943
  • 博文数量: 80
  • 博客积分: 1982
  • 博客等级: 上尉
  • 技术积分: 1737
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-26 22:41
文章存档

2013年(9)

2012年(71)

分类: LINUX

2012-10-08 20:27:23

函数原型:int getopt(int argc, char * const argv[], const char
                     *optstring);

extern char *optarg;
extern int optind, opterr, optopt;

    getopt() 用来解析命令行参数。参数 argc 和 argv 是由 main() 传递的参数个数和内容。参数 optstring 为选项字符串, 告知 getopt() 可以处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量 optarg 指向此额外参数。getopt() 正常情况下返回相应的选项字符,命令行所有参数全部解析完成后,返回 -1。如果在处理期间遇到了不符合 optstring 指定的其它选项 getopt() 将显示一个错误消息,并将全域变量 optarg 设为“?”字符,如果不希望 getopt() 印出错信息,则只要将全域变量 opterr 设为 0 即可。

getopt() 所涉及的全局变量包括:   
optarg——指向当前选项参数(如果有)的指针。
optind——再次调用 getopt() 时的下一个 argv 指针的索引。
optopt——最后一个已知选项。

optstring 中的指定的内容的意义(例如getopt(argc, argv, "ab:c:de::");   
1.单个字符,表示选项,(如上例中的abcde各为一个选项)   
2.单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给 optarg。(如上例中的b:c:)   
3 单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给 optarg。(如上例中的e::)

示例代码:

int main(int argc, char **argv)
{
    int ret;
    while((ret = getopt(argc, argv, "s:f:")) != -1)
    {
        switch(ret)
        {
            case 's': {
                printf("Size = %s\n", optarg);  break;
            }
            case 'f': {
                printf("Font = %s\n", optarg);  break;
            }
            default: {
                printf("Usage: %s [-s Size] [-f font_file] \n", argv[0]);
                return -1;  break;
            }   
        }
    }
    if (optind >= argc)
    {
        printf("Usage: %s [-s Size] [-f font_file] \n", argv[0]);
        return -1;
    }
    return 0;
}

# ./getopt_test -s 16 -f sim.tff 1.txt

    getopt_long() 的工作方式类似于getopt(),不过它还能接收长选项(--help)。在接收长选项之前,我们必须定义个一个结构体数组变量 longopts,指明我们希望获取的长选项。

函数原型:int getopt_long(int argc, char * const argv[], const char
              *optstring, const struct option *longopts, int *longindex);

struct option {
    const char *name; 
    int has_arg;
    int *flag;
    int val;
};
name:表示的是长参数名
has_arg:有3个值,no_argument(或者是0),表示该参数后面不跟参数值;required_argument(或者是1),表示该参数后面一定要跟一个参数值;optional_argument(或者是2),表示该参数后面可以跟,也可以不跟参数值。
flag:指明长选项如何返回,如果 flag 为 NULL,则 getopt_long() 返回与该项 option 匹配的 val 值。否则 getopt_long() 返回 0。
val:和 flag 联合决定返回值。
    option 数组的最后一个元素必须全部填充 0。
    getopt_long() 的最后一个参数 longindex 在函数返回时指向被搜索到的选项在 longopts 数组中的下标。longindex 可以为 NULL,表明不需要返回这个值。

示例代码:
int main(int argc, char **argv)
{
    struct option long_options[] =
    {
        {"h", no_argument, 0, 0},
        {"help", no_argument, 0, 0},
        {"input", required_argument, 0, 0},
        {"output", required_argument, 0, 0},
        {"v", no_argument, 0, 0},
        {0, 0, 0, 0}
    };
    while(1)
    {
        int option_index = 0, c=0;
        c = getopt_long (argc, argv, "xxx", long_options, &option_index);
       
        /* no more options to parse */
        if (c == -1) break;
       
        /* unrecognized option */
        if(c == '?') return -1;
           
        switch(c) {
            ……
        }
        switch(option_index) {
            ……
        }   
    }
}

    getopt_long_only() 类似于 getopt_long(),但是它把 '-' 开头的选项当作长选项来处理。如果该选项与长选项不匹配,而与短选项匹配,则作为短选项解析。

函数原型:int getopt_long_only(int argc, char * const argv[], const char
              *optstring, const struct option *longopts, int *longindex);


                       ——忠于梦想 勇于实践    linux_xpj@opencores.org

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