2017-01-30 3 views
0

これは前に尋ねられたことをお詫びします。私は見回しましたが、この特定の状況に関連する投稿を見つけることができませんでした。C:フラグのみにgetopt_longを使用すると、スイッチがありません。プログラムは最初の旗しか見ない

今、私は2つのフラグ--saveと--loadを実装しています。最終的に、彼らはroguealikeのためのダンジョンファイルの保存とロードを処理しますが、今はただ何かをやりたいだけです。ここでは、メインからの私のコードの関連部分です。

static struct option long_options[] = { 
    {"load", no_argument, &load_flag, 1}, 
    {"save", no_argument, &save_flag, 1}, 
    {0,0,0,0}, 
}; 
while((c = getopt_long(argc, argv, "f", long_options, NULL)) != -1) { 
    break; 
} 
if(load_flag == 1) { 
    printf("hey, the load flag works \n"); 
} 
if(save_flag == 1) { 
    printf("And the save flag works as well! \n"); 
} 

私が理解していることから、whileステートメントの条件は実際にフラグを設定する必要があります。しかし、code i adapted it fromには、必須の要素を持つオプションも含まれていたため、switch文とoptstring引数があります。私は自分の状況に合わせてコードを修正しようとしましたが、翻訳で何かが失われました。私はgetopt_longにoptstringの引数を残す必要がありました。私のコードでは何もしません。

変更されたコードを実行すると、 - save OR --loadが機能しますが、両方を使用すると、最初に入力されたものだけが登録されます。残念なことに、私の仕様では両方を一度に使用できると言われています。

私の質問は次のとおりです。

  1. なぜ最初のフラグだけが割り当てられるのですか。それを修正するにはどうすればよいですか?

  2. getopt_longにoptstring引数 "f"を残しておくと、コンパイラを満足させることができますか?それは間違ったアプローチですか?

答えて

1

breakは、最初の反復後whileループを停止するので、最初のオプションだけをチェックします。私はあなたがもともとswitchステートメントを持っていたと推測しているので、breakを使用してswitchを終了し、whileループを続行しました。 switchがないので、空のwhileループが代わりに機能するはずです。

その他の問題:あなたは-fオプションが受け入れられたくない場合は

  • あなたは"f"を渡すべきではありません。
  • '?'の戻り値が不明なオプションがいつ使用されたかを確認することもできます。
+0

これは完全に機能しました。ありがとうございました! –

関連する問題