C 传递时命令行参数编号不正确`*`
我正在写一个关于反向波兰符号的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
下面是要调试的小程序 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
数组