1

C コードのコマンド ライン引数パーサーとしてargtableを使用する機会があれば、ここに私の質問があります。

私の意図

argtable2 ライブラリの最新バージョンを使用して、Linux プラットフォームで C でプログラミングしています。

私がアーカイブしたいのは、複数の入力ファイルオプションのオプション(それを と呼びましょう)を取るプログラムがあること-oです。-oがシェル呼び出しのオプションとして提供されていない場合、プログラムによって出力はまったく書き込まれません-o単独で提供される場合、プログラムの出力は「output.txt」というデフォルトのファイルに書き込まれます。オプションがファイル名と共に指定された場合、たとえば-o other.txt出力は指定されたファイル名(この場合は「other.txt」) に書き込まれます。

問題

私のすべての試みで、argtable misbehaved。とともに指定されたオプションの値を入力ファイルとして解釈します。そのため、4 つの入力ファイル (3 つの "inputfile*.dat" と、出力ファイルであるはずの "other.txt") があると解釈されます。-o ./program -o other.txt inputfile1.dat inputfile2.dat inputfile3.dat

問題を再現する

これは、私が何を意味するかを説明するためのシェルセッションです。問題が発生する最小限の例を使用します。私が何か間違ったことをしたのか、それとも libargtable2のバグなのかはわかりません:

confus@confusion:~$ gcc -o argbug argbug.c -largtable2
confus@confusion:~$ ./argbug
Error: missing option INPUT-FILES

Usage:
./argbug [-o [<file>]] INPUT-FILES
-o [<file>]               File to write output to. Default is 'output.txt'.
                         Omit whole option to discard all output
INPUT-FILES               Input files
confus@confusion:~$ ./argbug inputfile1.dat inputfile2.dat inputfile3.dat -o other.txt
inputfile[0] = inputfile1.dat              # this is okay output
inputfile[1] = inputfile2.dat              # as is this line
inputfile[2] = inputfile3.dat              # also okay output
inputfile[3] = other.txt                   # "other.txt" is falsely recognized as an input file
outputfile = output.txt                    # should be "other.txt" instead of the default "output.txt"

いずれにせよ、argtable の作成者である私もスチュワードも、私の問題を実際に調査する時間がないようです。何か案は?

4

1 に答える 1

1

テストを実行したところ、同じ問題が見つかりました。ソースを調べると、libargtable が正しく処理しているように見えますが、それは getopt の動作に要約されます。

getopt.c の 647 行目以降を見ると、getopt が最初に、オプションと引数の間にスペースを入れずに引数が付加されているかどうかをチェックしていることがわかります (例: -oother.txt)。その場合は、それを処理します。これは、オプションの引数に気付く唯一のケースです。

これをテストするには、試してください

void *argtable[] = { argOutput, end };

あなたのテストケースで、そして

./argbug -o other.txt

エラーが発生することがわかります。

ただし、必要なオプションがあるかどうかを確認する追加のコードがあります。その場合、フラグと引数の間にスペースがあっても、これを満たすオプションを追加で検索します。

コードを見るためのヒント: has_arg は列挙型で、0=引数なし 1=必須引数 2=オプション引数

簡潔な答え

フラグと引数の間にスペースがある場合、libargtable はオプションの引数を処理しません。スペースを削除すると、機能するはずです。

私はこれをバグだと思うかもしれませんが、おそらくこの動作が好きな人もいるでしょう。

于 2012-08-31T07:35:50.230 に答える