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

C 传递时命令行参数编号不正确`*`,c,shell,command-line-arguments,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

我正在写一个关于反向波兰符号的C程序,它通过命令行参数获取操作数和运算符。但是,当乘法运算符“*”出现时,情况会出错,我不知道为什么。
下面是要调试的小程序

test.c

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

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

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

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

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

您需要像在
/test'*'
中那样将
*
单引号引起来(双引号也可以),这将防止shell扩展
*
。一个
*
被提供给您的程序。在这种情况下,shell将删除单引号

如果要计算表达式,可以执行以下操作

./test 3 2 '*'
在这种情况下,您的程序将收到3个分开的附加参数,因此
argv[1]
3
argv[2]
2
argv[3]
*

或者你可以:

./test '3 2 *'

在本例中,您的程序将收到一个附加参数,
argv[1]
将是字符串
32*

*
具有特殊含义。shell将扩展到运行程序的目录中的所有可见文件,您可以使用“x”作为乘法operator@Bathsheba确切地意味着我必须将“*”解析为*,-———不,您不必将“*”解析为
*
。shell将
*
更改为当前目录中的文件列表,并将
'*'
(或
“*”
)更改为仅
*
。因此,从shell中为程序提供一个包含
*
且不带引号的参数将只为程序提供一个参数。要使输入尽可能干净,请使用例如
echo“12*3*”| xargs./test
-这与
/test“12*3*”
一样干净,但也可以正确填充
argv
数组