【问题标题】:Using GNU getopt in C++ to read command line both as with and without argument在 C++ 中使用 GNU getopt 来读取带有和不带参数的命令行
【发布时间】:2016-03-14 05:58:18
【问题描述】:

我正在使用带有 :: 函数的 GNU 库,因此它应该接受我来自命令行 -p 和 -pc 的输入。但是当我通过 -p 时,它会给我一个分段错误。我必须在不带参数的情况下传递 -p,然后从命令行传递参数“c”。我的代码如下。请提出建议。

int main(int argc, char **argv) {
    char op= '\0';
    char arg = '\0';
    while( (arg = getopt(argc, argv, "p::")) != -1 ){
        switch (arg){
            case 'p': op = *optarg;
                if (op=='c')
                    flagp = true;
                else if (op=='\0')
                    flago = true;
                else
                    cout<<"Invalid parameter"<<endl;
        }
    }
}

【问题讨论】:

  • 我重新标记了 plain c,因为任何 C++ 的唯一外观是附带的输出语句,这不可能是罪魁祸首。
  • 请提供MVCE
  • 问题是我必须使用与命令行中的 -p 相同的字符 'p' 执行两个不同的功能,并且应该在没有我将 flagp 设置为 true 的参数的情况下工作,其他应该当我从命令行给出带有参数'c'的'p'作为-p c时工作,我将flago设置为true。所以设置 flagp 和 flago 让我打印两个不同的语句。为此,我正在使用 getopt(::) 功能,以便 p 通过接受参数甚至不接受参数来表现。它使用参数(-p c)工作正常,但使用(-p)给我一个分段错误。

标签: c gnu getopt


【解决方案1】:

不带选项处理-p时,getopt()设置optarg为NULL,op = *optarg指令导致段错误。您需要检查 optarg 是否为空。

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

int main(int argc, char **argv) {
    int flagp = 0;
    int flago = 0;
    char op= '\0';
    char arg = '\0';
    while( (arg = getopt(argc, argv, "p::")) != -1 ){
        printf("arg=%c\n", arg);
        switch (arg){
            case 'p': 
                if (optarg != NULL)
                {
                    op = *optarg;
                    if (op=='c')
                        flagp = 1;
                    else if (op=='\0')
                        flago = 1;
                    else
                        fprintf(stderr,"Invalid parameter\n");
                }
                else
                {
                    printf("optarg is NULL\n");
                    flago = 1;
                }
        }
    }

    printf("ending...\n");

    printf("flagp=%d\nflago=%d\n", flagp, flago);

    return 0;
}

输出:

>small -p -pc
arg=p
optarg is NULL
arg=p
ending...
flagp=1
flago=1

【讨论】:

  • 非常感谢。有效。但是,如果 p 和 c 之间有一个空格,例如 -p c 或 p 和 c 之间有多个空格,该怎么办。它将它读作 -p 而不是带有参数 c 的 -p。是否需要进行一些修改来调整它。
  • @maverick 这无法处理,因为您将参数设置为可选。
猜你喜欢
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
相关资源
最近更新 更多