Chinaunix首页 | 论坛 | 博客
  • 博客访问: 416260
  • 博文数量: 38
  • 博客积分: 2513
  • 博客等级: 少校
  • 技术积分: 471
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-22 13:35
文章分类

全部博文(38)

文章存档

2010年(4)

2009年(6)

2008年(28)

我的朋友

分类: C/C++

2008-10-30 09:35:49

Linux系统下,需要大量的命令行选项,如果自己手动的话,好麻烦的,实际上GNU已经为我们提供了一个解析命令行的接口(X/Open规范),好好使用它可以使你的程序改观不少。闲话不多说,附一份代码,剩下的自己运行测试吧。
 

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

/*********************************************************
 * struct option {
 *     const char *name;    //option name
 *     int    has_arg;      //describe option parameters
 *     int *flag;           //
 *     int val;             //
 * }
 * about has_arg:
 * no_argument          0
 * required_argument    1
 * optional_argument    2
 *********************************************************
 * about return value
 * 0:    return 0 if flag isn't NULL
 * 'x':  option character
 * '?':  invalid option
 * ':':  lack of option parameter
 * -1:   option parse over
 *********************************************************
 */


int g_help = 0;
int g_ver  = 0;

const char *soptions = "hvp:";
const struct option loptions1[] = {
    {"help",    no_argument,        NULL, 'h'},
    {"version", no_argument,        NULL, 'v'},
    {"path",    required_argument,  NULL, 'p'},
    {NULL,      0, NULL, 0}
};
const struct option loptions2[] = {
    {"help",    no_argument,        &g_help,    1},
    {"version", no_argument,        &g_ver,     1},
    {"path",    optional_argument,  NULL,     'p'},
    {NULL,      0, NULL, 0}
};


int parse1(int argc, char **argv)
{
char *path = NULL;
int ret = 0;

    while (-1 != (ret = getopt_long(argc, argv, soptions, loptions1, NULL))) {
        switch (ret) {
        case 'h':
            printf("param: help\n");
            break;
        case 'v':
            printf("param: version\n");
            break;
        case 'p':
            path = optarg;
            printf("param: path=%s\n", path);
            break;
        case ':':
            printf("param: lack long options\n");
            break;
        case '?':
            printf("param: unspecified param\n");
            break;
        }
    }

    return 0;
}


int parse2(int argc, char **argv)
{
char *path = NULL;
int ret = 0;

    while (-1 != (ret = getopt_long(argc, argv, soptions, loptions2, NULL))) {
        switch (ret) {
        case 0:
            printf("g_help = %d, g_ver = %d\n", g_help, g_ver);
            break;
        case 'p':
            path = optarg;
            printf("param: path=%s\n", path);
            break;
        case ':':
            printf("param: lack long options\n");
            break;
        case '?':
            printf("param: unspecified param\n");
            break;
        }
    }

    return 0;
}


int main(int argc, char **argv)
{
    parse1(argc, argv);
    parse2(argc, argv);

    return 0;
}


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

上一篇:守护进程

下一篇:linux日期时间函数

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