現在、コマンドラインで渡したフラグをプログラムに正しく認識させようとしています。次のコマンドライン ./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);
}
}