使用C中的getopt_long在终端中解析选项参数

时间:2015-10-25 21:43:49

标签: c terminal getopt-long

我在通过终端解析我的选项参数时遇到了问题。 执行我的c文件时,我只能有一个选项,即文件名。我可以输入两个选项的文件名(短选项和长选项):

  • -f
  • - 文件名

并且他们都需要文件名作为参数。 当我使用" -f"执行程序时和" - 文件名",它工作正常,但是当我测试" -filename"时,它并没有给我错误说"用法是......& #34;并且它将此选项的参数计为main的非选项参数之一(我不知道我是否表达得很好) 任何人都可以帮助我吗?我怎么处理这个?如何告诉用户这不是正确的选择? 到目前为止,这是我的代码:

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

static struct option longopts[] = {
    {"filename",  required_argument, 0, 'f'},
    {0, 0, 0, 0}
};

int main(int argc, char **argv) {
    int res;
    int indexptr;
    char *filename;
    while ((res = getopt_long(argc,argv,"f:",longopts,&indexptr)) != -1)
    {
        switch(res)
        {
        case 'f':
            filename = optarg; // the file is now in optarg 
            break;

        default: /* '?' */
            fprintf(stderr, "Usage: %s <[-f/--filename Filename]> <D> <U>\n", argv[0]);
            exit(EXIT_FAILURE);
        }
    }
}

谢谢

1 个答案:

答案 0 :(得分:1)

执行-filename(一个破折号)时,大多数getopt实现会将其视为与-f ilename相同(这不是错误)。如果你打印出它认为的文件名参数是你会看到&#34; ilename&#34;。