传递`*`时命令行参数号不正确

时间:2013-12-11 09:06:04

标签: c shell command-line-arguments

我正在编写一个关于反向波兰表示法的C程序,它通过命令行参数获取操作数和运算符。但是当乘法运算符'*'出现时出现问题,我不知道为什么 这是要调试的小程序。

test.c

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

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

那么为什么“ * ”参数会产生错误的结果?

2 个答案:

答案 0 :(得分:11)

*执行shell glob。因此,它将扩展到当前目录中的所有文件,这将是程序的参数,您的目录中有65个文件。如果您运行echo *

,您可以看到发生了什么

您需要单引*引用./test '*'(双引号也可以),这样可以防止shell展开*。在这种情况下,程序会给*,shell会删除单引号。

如果你想评估表达式,你可以做

./test 3 2 '*'

在这种情况下,您的程序会另外收到3个参数,因此argv[1]3argv[2]2argv[3]* < / p>

或者你可以这样做:

./test '3 2 *'

在这种情况下,您的程序会收到另外一个参数,argv[1]将是字符串3 2 *

答案 1 :(得分:8)

您的命令shell将*视为通配符。它可能包括当前目录中的每个文件:在你的情况下是60ish。