2012-02-25 8 views
2

私は、視点を理解するためにgetoptを使用して簡単なコードを書いています。getopt:欠落している引数 ':'と無効な引数を認識できません '? '

​​

問題がある:

(1)ケース1: case '?'は、その後、コメント化されている場合:

だから、
[[email protected] getopt]# ./a.out -a -b -c 
    Option found: a, optind = 2 
    Option found: b, optind = 3 
    ./a.out: option requires an argument -- c 

、あなたが見ることができるよう、case ':'はかかりませんでした通常は、欠落している引数がgetoptによって ':'(コロン)を返すことが予想されるため、効果があります。

(2)ケース2: AND、私はそれをアンコメントしている場合、その後、プログラムを実行し、それも引数が不足しているためcase '?を打ちます。

enter code here 
[[email protected] getopt]# ./a.out -a -b -c 
    Option found: a, optind = 2 
    Option found: b, optind = 3 
     ./a.out: option requires an argument -- c 
     Didn't you enter an invalid option? 

ここでは何が欠けていますか?

はLATER ADDED:

をまたなぜ./a.out: option requires an argument -- cは、デフォルトのエラーが来ているのですか?私はすでにcase ':'でそれを世話しているので、それを処理する方法は、デフォルトのエラーメッセージをしたくないですか? AGAIN

を追加しました:答えで示唆したように は、私がoptstringにの先頭にコロンを使用 - const char *optstring = ":abc:d"、なぜこの出来事はありますか? man getoptから

./a.out -a -b -c -d returns -d as the argument to c?? -d is a separate optional character and not any argument 
+0

注意: 'const char optstring [] = ...;'を使うと、余分なポインタ間接指定が保存されます。 –

答えて

3

getopt()機能のPOSIXバージョンが指定されています。

getopt()optstringに含まれていないオプション文字を検出した場合、それは<question-mark>( '?')文字を返します。欠けているオプション引数を検出した場合は、optstringの最初の文字が<colon>、それ以外の場合は<question-mark>文字( '?')だった場合は、<colon>文字( ':')を返します。

あなたoptstr:で始まらないので、代わりに?を返す必要があります。

+0

こんにちは、これで私を助けてくれますか?私は ":"を使用し、なぜ、 './a.out -a -b -c -d'は-dをcの引数として返すのですか? -dは別のオプション文字であり、引数ではありません – kingsmasher1

+0

これがPOSIX仕様の解釈方法です。実際には、コマンド行の最後のオプションだけが欠落した引数を報告できることを意味します。 (オプションを解析するコードがありますが、POSIXのgetopt()の後に、オプションの文字列にコロン ':'を指定することができます。これは引数がオプションであることを意味します。 getopt()は引数としてダッシュで始まる引数をゴブリングするので、コマンドラインで指定された最後のオプションを省略することができます。これは役に立たない... _また、別の方法を説明します) –

+0

ありがとう、役立ちました。 – kingsmasher1

4

: '?'

のgetopt()は optstringの中に含まれていなかったargvの中にオプション文字が見つかった、またはそれが欠けているオプション引数を検出した場合、それが返された場合は を呼び出し、外部変数optoptを実際のオプション文字に設定します。

したがって、プログラムの動作は意図したとおりに設計されています。 - optstringにのコロンがある(」

もし最初の文字(「」上記 を説明し、次のいずれかのオプションの「+」または):あなたはmanページでは、この文でのgetoptの期待収益値を混乱することができます: ')、getopt()は': 'の代わりに': ' を返します。欠落しているオプション引数を示します。エラーが検出され、optstringの最初の文字がコロンでなく、外部変数opterrが0でない(デフォルト)場合、getopt()はエラーメッセージを表示します。

だから、次のようにoptstringに宣言してみてください。

const char *optstring = ":abc:d"; 
+0

私は ":"を使用して、なぜ、 './a.out -a -b -c -d'が-dをcの引数として返すのですか? -dは別の任意の文字であり、何も引数ではありません。 – kingsmasher1

+0

@ kingsmasher1、 '-c'は引数を必要とせず、' -c'が引数として取られた後に与えられたものをとります。 –

関連する問題