2013-12-11 9 views
6

私は逆ポリッシュの表記法に関するCプログラムを書いています。これはオペランドと演算子をコマンドライン引数で取ります。しかし、乗算演算子 '*'が出現すると状況が間違ってしまい、その理由が分かりません。
デバッグする小さなプログラムです。`*`を渡すときに不正なコマンドライン引数番号

int main(int argc, char **argv) 
{ 
    printf("%d\n", argc); 
    return 0; 
} 

// run case   result 
    ./test a b   3 
    ./test *    66 

test.cのはなぜ '*' 引数が間違った結果になりますか?

+2

'*'になります。 – Maroun

+1

シェルはプログラムを実行するディレクトリ内のすべての可視ファイルに '*'を展開します。ちょうどxを乗算演算子として使用するかもしれません – hetepeperfan

答えて

11

*はシェルグロブを実行します。したがって、現在のディレクトリのすべてのファイルに展開されます。これはプログラムの引数になります。ディレクトリには65個のファイルがあります。あなたはあなたが./test '*'のように*は(二重引用符は、あまりにも動作します)、これは*を拡大シェルを防ぐことができます単一引用符に必要echo *

を実行する場合は何が起こっているかを見ることができます。この場合は*がプログラムに与えられ、シェルはシングルクォートを削除します。

あなたが式を評価する場合は、この場合、

./test 3 2 '*' 

を行うことができ、あなたのプログラムは3つの追加引数がそうargv[1]を分離受けargv[2]2argv[3]で、3ある*

それとも可能性がありますdo:

./test '3 2 *' 

この場合、プログラムは1つの追加の引数を受け取ります。argv[1]は、文字列3 2 *

+0

@Bathsheba、まさに! – Bin

+0

私は '*'を*、-_-として解析する必要があります。 – Bin

+3

いいえ、 ''*''を '*'として解析する必要はありません。これはカレントディレクトリのファイルリストに '*'を変更し、 '*'(または '*" ')だけを' * 'に変更するシェルです。だからあなたのプログラム ''*' 'をシェルから与えると、あなたのプログラムに引用符のない' * 'を含む引数が1つだけ与えられます。 – Shahbaz

8

コマンドシェルが*をワイルドカードとして処理しています。おそらく現在のディレクトリにあるすべてのファイルが含まれています:あなたの場合は60ishです。

関連する問題