【问题标题】:getopt_long treat option name as argumentgetopt_long 将选项名称视为参数
【发布时间】:2014-06-24 06:18:56
【问题描述】:

我使用 getopt_long 读取命令行选项。代码:

#include <getopt.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
    int ch;
    struct option longopts[] = {
        {"password", required_argument, NULL, 'p'},
        {"viewonly", no_argument, NULL, 'v'},
        {"help", no_argument, NULL, 'h'},
        {NULL, 0, NULL, 0}
    };
    while ((ch = getopt_long(argc, argv, "p:vh", longopts, NULL)) != -1) {
        switch (ch) {
        case 'p':
            printf("optarg: %x %s\n", optarg, optarg);
            break;
        case 'v':
            printf("viewonly is set\n");
            break;
        case 'h':
        case '?':
        default:
            fprintf(stderr, "error\n");
            exit(EXIT_FAILURE);
        }
    }
    return 0;
}

我使用这个命令行选项:./a.out --password --viewonly,它应该打印错误消息--password 缺少参数,但getopt_long 从不返回'?',但将--viewonly 视为optarg --password。输出是:

optarg: 24992bc4 --viewonly

我觉得很奇怪,应该怎么做才能防止getopt_long把选项名当作参数呢?

【问题讨论】:

  • 你不能。相反,您必须稍后在代码中检测问题,例如在检查密码时,然后告诉用户用户提供了错误的密码。
  • 但它也隐藏了viewonly 选项,不被读取。可以手动正确吗?
  • 如果用户提供了错误的密码,你会在程序中使用viewonly选项吗?用户传递了错误的密码(或者像您的情况一样“丢失”)这应该是一个非常致命的错误,这意味着用户将使用(希望是正确的)密码重新运行您的程序,问题是没有实际意义。您的问题只是此处提供的小测试程序中的问题。
  • 如果您使用的是 C++,请尝试使用 Boost Program Options。
  • 就在这里。但我认为还有一些其他条件需要考虑。为什么 getopt_long 没有检测到 optarg 是否以'-'或'--'开头并返回'? ?

标签: c++ c linux getopt getopt-long


【解决方案1】:

我会在我的 switch 语句中检查一些错误(可能检查密码不能以'--'开头)

【讨论】:

    猜你喜欢
    • 2017-03-28
    • 2016-04-06
    • 2016-07-17
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多