3

我想在运行时输入一些命令行参数。像

./program abc def ghi

argc在这种情况下为 4。在这方面没有问题。但如果我这样做

./program abc def *

甚至

./program * abc def

这个变量argc给了我一个远大于 4 的值。

在将整个argv数组(不包括第 0 个参数;./program)打印为字符串时,我会得到一个列表,其中前两个元素是abcdef其他元素是工作目录中包含的文件的所有文件名。

我正在尝试向 K&R 学习 C。我正在尝试制作一个 RPN 计算器,我们可以在其中给出诸如./program 2 4 *.

这是什么原因?还是我在某个地方错了?

4

4 回答 4

9

Shell 有一个称为globbing的功能,它们在其中扩展某些模式,例如*匹配文件。如果在当前目录中,您有以下内容:

file1 file2 somethingelse dir1

然后调用:

any_program *

将相当于:

any_program file1 file2 somethingelse dir1

或者,如果您这样做:

any_program fi*

它将相当于:

any_program file1 file2

这是外壳的一个特性。您的 C 程序表现良好。


由于 shell 不同,我们假设您使用的是bash. 为了防止bash执行扩展,您应该引用该参数。例如:

any_program "fi*"

实际上会传递fi*给您的程序,而不会将其扩展为file1 file2.

于 2015-03-25T14:30:27.523 回答
3

命令行解释器*在将参数传递给程序之前将字符作为通配符处理,就像键入DIR *.

简单的解决方案是设计一个不会被解释的有意义的参数。

于 2015-03-25T14:32:54.597 回答
2

如果您使用的是 bash,请使用-f开关启动 shell 以关闭扩展,例如*

bash -f

于 2015-03-25T14:39:11.220 回答
0

您可以通过将 * 放在单引号中来防止 * 扩展为文件名,即

./program 2 4 '*'

这样,您的程序将接收 3 个输入参数,以 C 字符串表示,其值为“2”、“4”和“*”。

于 2015-03-25T14:38:20.760 回答