9

私はプログラム入力を渡しており、argvでそれらを見ることができましたが、getoptには期待する引数がないようです。

これが私のプログラムの実行方法です:./ my_prog -X -f filename

<snip>
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

</snip>

私は常にoptargをnullとして取得します。なぜ?

4

4 に答える 4

12

引数文字列にはXの後に:がないため(X:fなど)、optargは常にnullになります。

また、一般的にswitchステートメントでは、各ケースの後にブレークが必要になることも指摘します(通常、常にではありませんが、通常は引数を解析する場合)。

switch ( ... ) {
    case 'X': {
        // do something
    } break;

    case 'f': {
        // do something else
    } break;
}
于 2011-06-23T06:33:43.910 に答える
2

他の人がこのページにアクセスする場合: http ://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html#Using-Getoptから: An option character in this string can be followed by a colon (‘:’) to indicate that it takes a required argument. If an option character is followed by two colons (‘::’), its argument is optional; this is a GNU extension.

したがって、あなたの議論では、「X:f:e:E:d:D:」を使用するかもしれません。

同じ問題がありました。

于 2012-03-30T07:47:09.553 に答える
2

私はこの問題に対処したばかりですが、この質問には完全には答えられなかったようです。

;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

乾杯、

ジョン

于 2014-06-20T16:07:09.267 に答える
0

私はこれが古いことを知っていますが、私は最近、getoptを何年も前に使用していた方法の変更された動作に気づきました。おそらくそれは別の環境でしたが、今日それを使用するには、optargがフラグの直後(スペースなし)である必要があります。そうでない場合、optargはnullです。

あなたの例を使用して./my_prog -X -f filename./my_prog -X -ffilename

気分が悪いのに、うまくいくと思います。これが後で誰か他の人を助けることを願っています。必ず両方の方法で試してください。

于 2021-07-09T16:05:05.103 に答える