0

私は Linux 環境で C++ プログラミングを行っており、getopt を使用してコマンド ライン引数を解析しようとしています。入力 -s または -q (それぞれ longforms --stack および --queue) を要求したいのですが、両方ではなく、必要な引数を指定した入力 -o も必要です。

int opt = 0, index = 0, stack=-1, map=-1;
while((opt = getopt_long (argc, argv, ":sqho:", longOpts, &index)) != -1){
    cout<<opt;

    switch(opt) {
        case 's':
            stack=0;
            cout << "Stack"<<stack<<"\n";
            break;
        case 'q':
            stack=1;
            cout << "Queue"<<stack<<"\n";
            //optarg is defined in getopt.h
            break;
        case 'h':
            cout<< "To run this program, use one of the valid cmd line args (longforms: stack, queue, help, output (M|L); shortforms: s, q, h, o (M|L), respectiely) \naccompanied with appropriate file redirection";
            exit(0);
            break;
        case 'o':
            //opt is 'M' or 'L'
            cout<<"output method is: "<<optarg<<"\n";
            if(*optarg=='M') map=1;
            else if(*optarg=='L') map=0;
            else map=-1;
            cout<<map<<"\n";
        case ':':
            cerr<<"Map or list output must be specified as an argument to -o: "<<opt<<"\n"; 
        case '?':

            cerr << "Command line error. one or more flags not recognized: " <<opt<<"\n";
            //exit(1);
            break;
    }

}
for(int i=1; i<argc; i++){
    cout<<*argv[i]<<endl;
}
return 0;

}

これには、上部に適切な #includes が含まれており、正常にコンパイルされます。

ただし、./hunt -q -o M を実行しようとすると、'q'、'o'、':'、および '?' のケースが表示されます。すべて実行します。「:」と「?」をトリガーしている文字を出力することにしました。ブロックし、コンソールには文字「o」の ASCII 値である 111 が表示されます。

getopt が 'o' ブロックをトリガーした後、これ以上コマンドライン引数がないことを示す -1 を返すべきではないので、これは私にとって非常に紛らわしいですか? ヘルプ/提案をいただければ幸いです。ありがとう!

4

1 に答える 1

0

breakとにがcase 'o'ありませんcase ':'

oこれにより、 からへのフォールスルーが発生:?ます。

于 2014-01-26T00:41:37.773 に答える