1

cでプログラムを呼び出す引数の1つに'*'を渡すと、argcの値に異常があります。cで簡単なコードを作って「test2.c」として保存しました。

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char* argv[])
{
printf("%d\n",argc);return 0;
}

私はそれをコンパイルし、次のように呼び出します--

dev@ubuntu:~$ gcc test2.c -o t
dev@ubuntu:~$ ./t *
31

したがって、引数のカウント値を 31 として取得しています。一方、「*」が他の二項演算子に置き換えられた場合; argc の値は 2 です (これも論理的に正しいです)。

dev@ubuntu:~$ ./t +
2

なぜそうなのか、私には理解できません....もう1つ興味深いことがあります.「- 」が「」の代わりに使用されている場合、答えは2です(これも論理的に正しいです)

dev@ubuntu:~$ ./t -*
2

誰でもこれで私を助けることができます;前もって感謝します。

4

4 に答える 4

10

それは単なるシェル拡張です。シェルは*、プログラムが実行されている現在のディレクトリ内のファイル名 (ディレクトリを含む) に展開します。

+または;特別な解釈がないため、通常の文字列と見なされますが、*特別な解釈があるため、現在のディレクトリ内のすべてのファイルのリストに展開され、プログラムに渡されます。

使ってみて

./t '*'また./t \*

これにより、 の特別な解釈が停止し*ます。最初のものは bash (bashにいるように見えます) 単一引用符を使用しました。これは、引用符のパターン内で特別な解釈を行わず、次のものはエスケープ シーケンスを使用します。

于 2012-07-02T10:31:34.583 に答える
6

*現在のディレクトリ内のファイルのリストに展開するのはシェルです。を印刷して、argvこれが事実であることを確認します。

于 2012-07-02T10:30:16.467 に答える
2

argcは常にの要素数を示しますargv[]。渡される引数にargv[]は常に少なくとも実行可能ファイルの名前が含まれるためargc、引数の数は常に+1です。

シェルはローカルディレクトリ内のすべてのファイルとディレクトリに展開されるため、この*ケースは特殊です。*展開したくない場合は、二重引用符の*ように渡します。"*"

echo *シェルでvsを試してecho "*"、どのよう*に拡張されるかを確認してください。

于 2012-07-02T10:34:19.127 に答える
1

これは、スター演算子*を、このプログラムを実行している現在のディレクトリに展開するシェルです。

~シェルが実行を開始する前に、 (チルダ)、{}(波括弧)、$(パラメーター)など、いくつかの展開が実行されますが、もちろんオペレーティング システムによって異なります。以下のリンクで拡張の GNU リストを見つけることができます。

GNU BASH マニュアル - 3.5.3 シェル パラメータの展開

ヒント: 引数の値を出力した場合、おそらくディレクトリとファイルのリストが表示され、引数カウント 'argc' は実行元のディレクトリに応じて変化します。

于 2012-07-02T10:39:21.083 に答える