现在,我正在尝试让我的程序正确重新变色我在命令行中传递给它的标志。鉴于MineEscape是可执行文件的名称,以下命令行./MineEscape --container BINARY infile.txt可以正常工作。但是,我在使此命令行正常工作时遇到问题,。/ MineEscape --verbose 15 -c PAIRING infile.txt> outfile.txt

还要注意,命令行的必需标志是--container和一种容器类型,例如PAIRING或BINARY。以及--verbose后应跟一个整数。

运行错误的命令行时,我的详细部分有问题,说存在段错误。

int main(int argc,char **argv){


struct arguments{
    bool binary;
    bool poorMan;
    bool sorted;
    bool pairing;
    int outputStatistics;
} choice;

const struct option longOpts[]{
    {"help",optional_argument,NULL,'h'},
    {"container",required_argument,NULL,'c'},
    {"verbose",optional_argument,NULL,'v'}
};

stringstream ss;

int opt=0,longIndex=0;
opt=getopt_long(argc,argv,"v:c:h",longOpts,&longIndex);
while(opt!=-1){
    switch(opt){
        case 'h':
            //Print out description of executable

            exit(0);
            break;
        case 'c':
            if(!strcmp("BINARY",optarg))
                choice.binary=1;
            else if(!strcmp("POOR_MAN",optarg))
                choice.poorMan=1;
            else if(!strcmp("SORTED",optarg))
                choice.sorted=1;
            else if(!strcmp("PAIRING",optarg))
                choice.pairing=1;
            else{
                ss<<"Sorry, not a valid container implementation\n";
                cout<<ss.str();
                exit(0);
            }
            break;
        case 'v':
            if(atoi(optarg)>0)
                choice.outputStatistics=atoi(optarg);
            else{
                ss<<"Sorry, requires a value greater than 0\n";
                cout<<ss.str();
                exit(0);
            }
            break;
        default:

            break;
    }
    opt=getopt_long(argc,argv,"v:c:h",longOpts,&longIndex);
}
}

最佳答案

您会发现'optarg'的值为NULL,尽管将其指定为“ v:”。

我发现例如使用“ -v3”或“ -v 3”就可以了。但是“ --verbose 3”失败,而“ --verbose = 3”起作用。

奇怪的是,此行为似乎仅带有可选参数。

这个link有更多

gcc 4.4.6

关于c++ - GetOpt Long识别详细,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19575476/

10-09 08:58