Getopt加入参数

时间:2013-03-11 01:14:08

标签: c++ c parameters parameter-passing getopt

使用getopt函数解析是否有办法:

./prog -L -U

与:

相同
./prog -LU    

这是我的尝试(不工作):

while ((c = getopt(argc, argv, "LU")) != -1) {
    switch (c) {
    case 'L':
        // L catch
        break;
    case 'U':
        // U catch
        break;
    default:
        return;
    }
}

在这个简单的例子中只有2个参数,但在我的项目中需要6个参数的所有组合。例如:-L-LURGHX-LU -RG -H等。 getopt()可以处理吗?或者我必须编写复杂的解析器才能做到这一点?

3 个答案:

答案 0 :(得分:2)

getopt does seem capable of handling itand it does

  

以下是一些示例,显示了此程序使用不同的参数组合打印的内容:

% testopt
aflag = 0, bflag = 0, cvalue = (null)

% testopt -a -b
aflag = 1, bflag = 1, cvalue = (null)

% testopt -ab
aflag = 1, bflag = 1, cvalue = (null)

答案 1 :(得分:2)

它的行为完全符合您的要求:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv) 
{
    int c;

    while ((c = getopt(argc, argv, "LU")) != -1) {
        switch (c) {
        case 'L':
            puts("'L' option");
            break;
        case 'U':
            // U catch
            puts("'U' option");
            break;
        default:
            puts("shouldn't get here");
            break;
        }
    }

    return 0;
}

测试一下:

precor@burrbar:~$ gcc -o test test.c
precor@burrbar:~$ ./test -LU
'L' option
'U' option
precor@burrbar:~$ ./test -L -U
'L' option
'U' option
getopt() is a POSIX standard function后面的

POSIX "Utiltiy Syntax Guidelines",其中包括以下内容:

  

准则5:       当在一个' - '分隔符后面分组时,应该接受没有选项参数的选项。

答案 2 :(得分:2)

保存缺少的大括号,您的代码适用于我:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv) {
    int c;
    while ((c = getopt(argc, argv, "LU")) != -1) {
        switch (c) {
        case 'L':
            // L catch
            printf("L\n");
            break;
        case 'U':
            // U catch
            printf("U\n");
            break;
        default:
            break;
        }
    }
    return 0;
}
$ ./a.out -LU
L
U
$ ./a.out -L
L
$