在C ++中使用GNU getopt来读取命令行,无论是否有参数

时间:2016-03-14 05:58:19

标签: c gnu getopt

我正在使用带有:: function的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;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

当没有选项处理-p时,getopt()将optarg设置为NULL,并且op = * optarg指令导致分段错误。你需要检查optarg不是null。

#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