GetOpt Long 認識到冗長

GetOpt Long recognizing Verbose

本文关键字:Long GetOpt      更新时间:2023-10-16

现在,我正在尝试让我的程序正确地重新定位我在命令行中传递给它的标志。以下命令行 ./MineEscape --container BINARY infile.txt 工作正常,因为 MineEscape 是可执行文件的名称。 但是,我在让这个命令行工作时遇到了问题,./MineEscape --verbose 15 -c 配对文件.txt>输出文件.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 implementationn";
                cout<<ss.str();
                exit(0);
            }
            break;
        case 'v':
            if(atoi(optarg)>0)
                choice.outputStatistics=atoi(optarg);
            else{
                ss<<"Sorry, requires a value greater than 0n";
                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"有效。

奇怪的是,这种行为似乎只带有可选参数。

此链接有更多

海湾合作委员会 4.4.6