在C++;以带参数和不带参数的方式读取命令行

在C++;以带参数和不带参数的方式读取命令行,c,gnu,getopt,C,Gnu,Getopt,我将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){

我将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;
        }
    }
}
int main(int argc,char**argv){
字符op='\0';
字符arg='\0';
while((arg=getopt(argc,argv,“p:”)!=-1){
开关(arg){
案例“p”:op=*optarg;
如果(op=='c')
flagp=真;
else if(op=='\0')
flago=真;
其他的

cout在没有选项的情况下处理-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;
}

我之所以拖延是因为任何C++的唯一外观是附带的输出语句,这不能成为罪魁祸首。请提供一个问题,我必须使用命令行中的相同字符“p”作为-p来做两个不同的功能,并且应该在没有一个参数的情况下工作,我将它设置为真,而其他应该工作WH。en我在命令行中将带有参数“c”的“p”设置为-pc,并将flago设置为true。因此,设置flagp和flago可以让我打印两个不同的语句。为此,我使用getopt(::)功能,使p通过接受参数甚至不接受参数来运行。参数(-pc)可以正常工作但是给我一个分段错误(-p)。非常感谢。它起作用了。但是,如果在p和c之间有一个空格,比如-p c,或者在p和c之间有多个空格,该怎么办呢?它的读法是-p而不是带参数c的-p。是否需要做一些修改来调整它。@maverick这是无法处理的,因为您将参数设置为可选的。
>small -p -pc
arg=p
optarg is NULL
arg=p
ending...
flagp=1
flago=1