私はこの問題に対処したばかりですが、この質問には完全には答えられなかったようです。
;opterr = 0
を呼び出す前に、外部libc変数を設定していることを確認する必要があります。getopt
リセットせず、getopt
以前にそれを使用したシステム内の別のアプリケーションでエラーが発生した場合、引数に対して失敗します。また、その後にブレークステートメントがないためcase 'X':
、問題が発生するため、問題の確かな兆候であるという既存のポイントを繰り返します。
getopt
一度に1つの引数しか処理しないため、大文字と小文字X
を区別f
するのは悪いことです。switch
それが失敗することが絶対に確実でない限り、aの各caseステートメントで常に休憩をとる必要があります(これは私の経験では非常にまれです)。もう1つの一般的なグッドプラクティスとして、プログラムフローが現在または親のブロックスコープから外れたり、入力したりするreturn
ステートメントなどでない限り、コードのブロックを常に{}(条件を参照)で囲む必要があります。break
関数またはメソッドの呼び出しによる新しいスコープ。
オプション文字列Xf:eE:dDで問題ないと思います。これは次のことを示しています。
1)以下は、常にnull引数を持つオプションフラグです:XedD
2)次のオプションには引数が必要です:fE
これが探している機能である場合は、指定されたオプション文字列で問題ありません。GNU libcを使用している場合は、上記の他の回答に従って、オプション文字列のオプションの後に::を使用して、オプションに引数がある可能性があることを示すことができますが、引数がある必要はありません。
したがって、ファイルの先頭に、少なくとも次のものがあることを確認してください。
extern int opterr;
getopt
次に、コードで初めて呼び出す直前にopterr
、0に設定します。
例えば
opterr = 0;
while ((opt = getopt(argc, argv, "Xf:eE:dD")) != EOF) {
switch (opt) {
case 'X':
case 'f':
if (optarg == NULL)
fput("no point of living", fp); << for debugging
これにより、問題が少なくとも部分的に解決されるはずです。例へのリンクは次のとおりです。
http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html
乾杯、
ジョン