正确的解析(选项)参数的方法,关于getopt(3)和argv的问题

时间:2013-11-13 18:15:01

标签: c

作为一个例子,我想实现以下功能: listtool [-s | -a NUM]<字符串>

我的方法如下:

int opt;
int opt_s = -1, opt_a = -1, num;
char *optstr ="<not yet set>";
num = -1;

if( argc < 3 || argc > 4 ) {
    fprintf(stderr, "Wrong number of arguments");
    usage();
}

/* Options */
while ((opt = getopt(argc, argv, "sa:")) != -1) {
    switch (opt) {
    case 's': {
        if (opt_s != -1) {
            fprintf(stderr, "opt_s multiple times\n");
            usage();         /* does not return */
        }
        else if (opt_a != -1) {
            fprintf(stderr, "Please only choose one option\n");
            usage();
        }
        else {
            ++opt_s;
            break;
        }
    }
    case 'a': {
        if (opt_a != -1) {
            fprintf(stderr, "opt_a multiple times\n");
            usage();        /* does not return */
        }
        else if (opt_s != -1) {
            fprintf(stderr, "Please only choose one option\n");
            usage();
        }
            ++opt_a;
            ++num; 
            break;
        }
    case '?': {
        usage();
        break;
    }
    // Impossible
    default: {
        assert(0);
    }
    }
}

/* Arguments */
if( num > -1 ) {
    if( (argc - optind) != 2 ) {
        usage();
    }
    num = (int)strtol( argv[optind], NULL, 0 );
    *optstr = argv[optind+1];
}
else {
    if( (argc - optind) != 1 ) {
        usage();
    }
    *optstr = argv[optind];
}

这段代码有一些不起作用的东西。我想知道为什么,以及正确的方法是什么。

  • 首先,getopt试图解析参数而不是进入?情况下
  • (optind - argc)不会抛出正确数量的参数
  • 将argv [optind]赋值给optstr throws:

    warning: assignment makes integer from pointer without a cast

提前感谢您的每一个答案

1 个答案:

答案 0 :(得分:1)

对第3个问题the assignment of argv[optind] to optstr throws: warning ?的回答如下,

char *optstr; 
*optstr = argv[optind]; // Wrong if LHS is a string rather a char


optstr = argv[optind]; // Correct one

这里,optstr是一个指向字符的指针,可以存储单个字符或字符串。 此外*optstr引用char,RHS argv[optind]是字符串引用指针。因此警告。