2

カスタムargcおよびargvでgetopt_long()関数を使用するのに問題があります。

実際のコマンドライン引数ではなく、文字列で引数を受け取ります。次に、この文字列からnew_argcとnew_argvが作成され、getopt_long()で使用されます。ただし、getopt_long()は最初の呼び出し自体で失敗します。EOFおよびoptarg=NULLを返します。

string is "-c 10.30.99.41" 
new_argc = 3
new_argv[0]=>./prog_name
new_argv[1]=>-c
new_argv[2]=>10.30.99.41

コマンドライン引数を渡せば、getopt_longは問題なく動作します。だから私の短いオプションと長いオプションは正しいです。しかし、new_argcとnew_argvを渡すと、失敗します。

私の短いオプションと長いオプションは正しく、argvはNULLで終了していると確信しています。ここにこれ以上コードを投稿できないことをお詫び申し上げます。

getopt_longをカスタムargcおよびargvで使用できるかどうかは疑問です。argc、argvに関連するlibc内の他のコードを参照している必要があるため、実際のargcとargvでのみ機能すると思われます。コメントはありますか?

option = getopt_long( new_argc, new_argv, short_options, long_options, NULL );
4

1 に答える 1

6

編集:

「変数optindは、argvで処理される次の要素のインデックスです。システムはこの値を1に初期化します。呼び出し元は、同じargvのスキャンを再開するか、新しい引数ベクトルをスキャンするときに、この値を1にリセットできます。」

あ、はい。getopt_longを使用して、引数または別の引数リストを再度スキャンできます。ただし、誰かが以前にgetopt_longを呼び出したことがある場合は、グローバルoptind変数を1に戻す必要があります。

argvin main()はNULLで終了し、argc長いことを覚えておいてください。argv [argc]==NULL。したがって、自分の最後の要素がnew_argvNULLポインタであることを確認する必要があります。

(投稿するときに関連するすべてのコードを表示してください。エラーが何であるかを推測するのは難しいです。たとえば、short_options実際long_optionにnew_argvを作成する方法、変数宣言などを表示します。)

于 2011-10-28T16:42:33.757 に答える