2012-02-06 11 views
3

私はいくつかのフラグを受け入れる必要があるLinuxベースのコマンドラインユーティリティを開発しています。私は主なユーティリティの外で使用していたテストコードを投稿します。私はこのコードを使用していたので、私がちょうど挿入できるコードを作業するまで、実際のユーティリティを変更する必要はありませんでした。argc、argvとその使用法の面白い所見

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv) { 
    while(--argc && (*++argv)[0] == '-') 
     putchar('*'); 

    printf("\n%s\n", argv[0]); 
} 

はすべてこのプログラムはないという事実を無視してくださいアスタリスクを印刷し、1引数-bで呼び出されたときに独自の名前を印刷されていますので、ここで私はいじるされているコードがあります。アステリックの印刷は、ループが一回実行されたことを示すことに過ぎませんでした。だから、私は「./test -n」などの端末でこれを実行し、私は出力があることが予想:。私の驚きに/テスト

多く*

、出力されました:

* -b

ステートメント (*++argv)[0]の作業理論はありますが、まだ少し曇っています。私の前提は、指し示す各​​文字列の最初の文字を見てポインタの配列を横切って進み、(*++argv)[0]は最初の引数文字列の*argv[0]または要素ゼロを逆参照しています。

だから、基本的に私は3つの質問している:その文は正確に何を

  1. をしているのですか?
  2. 私は何を試しても、なぜargv [0]またはargv [0] [0]に戻ることができないのですか?
  3. argv [0]が指し示すアドレスに別のchar *で値を格納していますが、これがこの時点でその値にアクセスできる唯一の方法です。

私は現時点でこれに悩まされており、これを解決するために私が考えることができるすべてを試しました。ある時点で、アルファベットを印刷するループがありました。プログラムがアクセスしていたメモリの部分はわかりません。最も興味深いのは、sshid変数をどこかから引き出すことでした。

ご協力いただきありがとうございます。

答えて

6

++argvargvが次の引数を指すように変更します。

ではなくargvを上書きするの、別のインデックスを維持

int i = 0; 
while(--argc && argv[++i][0] == '-') 

のようなものを試してみてください。

それとも代わりに、元のargvのコピーを変更する以外、オリジナルと同じ働き

char** argp = argv; 
while(--argc && (*++argp)[0] == '-') 

+0

それで私の妥協は正しいです。これは共通のものですか?私は前にこれに遭遇していない。 – Brandon

+3

* C *の配列ポインタをインクリメントするのは単なるセマンティクスです。それはプログラムの引数を渡すことに特有のものは何もありません –

+0

これはかなり一般的な使い方です。for(i = 0; i

関連する問題