0

現在、コマンドラインで渡したフラグをプログラムに正しく認識させようとしています。次のコマンドライン ./MineEscape --container BINARY infile.txt は、MineEscape が実行可能ファイルの名前であるため、正しく機能します。ただし、このコマンドラインを機能させるのに問題があります./MineEscape --verbose 15 -c PAIRING infile.txt > outfile.txt

また、コマンド ラインの必須フラグは --container であり、PAIRING や BINARY などのコンテナーのタイプであることに注意してください。--verbose と同様に、整数が続く必要があります。

間違ったコマンド ラインを実行すると、冗長部分に問題が発生し、segfault が発生したとのことです。

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);
}
}
4

1 に答える 1

1

「v:」と指定されているにもかかわらず、「optarg」の値が NULL になっていることがわかります。

たとえば、「-v3」または「-v 3」が使用されている場合、それは問題なく解析されることがわかりました。しかし、「--verbose 3」は失敗し、「--verbose=3」は機能します。

奇妙なことに、この動作はオプションの引数のみのようです。

このリンクには詳細があります

gcc 4.4.6

于 2014-02-17T18:00:09.527 に答える