1

当“*”作为调用 c 程序的参数之一传递时,argc 的值存在异常。我在c中做了一个简单的代码并将其保存为'test2.c'。这是'test2.c'的以下代码---

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char* argv[])
{
printf("%d\n",argc);return 0;
}

我编译它并称之为——

dev@ubuntu:~$ gcc test2.c -o t
dev@ubuntu:~$ ./t *
31

所以,我得到的参数计数值为 31;而如果 '*' 被任何其他二元运算符替换;argc 的值为 2(这在逻辑上也是正确的)。

dev@ubuntu:~$ ./t +
2

我无法理解为什么会这样......还有一件更有趣的事情。当使用'-'代替' '时;答案是2(这在逻辑上也是正确的)

dev@ubuntu:~$ ./t -*
2

任何人都可以帮助我吗?在此先感谢。

4

4 回答 4

10

它只是外壳扩展。shell 将扩展*为程序正在执行的当前目录中的文件名(包括目录)。

+or;没有特殊解释,因此它们被视为普通字符串,但*具有特殊解释,因此它被扩展为当前目录中所有文件的列表,并传递给您的程序。

尝试使用

./t '*'或者./t \*

这停止了​​对*. 第一个使用了 bash (看起来你在 bash 中) 单引号,它不会对引号中的模式进行任何特殊解释,下一个使用转义序列。

于 2012-07-02T10:31:34.583 回答
6

它是扩展*为当前目录中文件列表的 shell。打印出来argv看看是不是这样。

于 2012-07-02T10:30:16.467 回答
2

argc将始终为您提供argv[]. 传递给的参数argv[]将始终至少包含可执行文件的名称,因此argc始终是参数数量 + 1。

这种*情况虽然很特殊,因为您的 shell 将扩展*到本地目录中的所有文件和目录。如果您不想*被扩展,请像"*"使用双引号一样传递它。

在你的 shell 中尝试echo *vsecho "*"看看如何*扩展。

于 2012-07-02T10:34:19.127 回答
1

这只是将星号运算符扩展*到您正在执行该程序的当前目录的外壳。

在 shell 开始执行之前执行了几个扩展,例如~(tilde)、{}(braces) 和$(parameters),当然这取决于您的操作系统。您可以在下面的链接中找到 GNU 扩展列表。

GNU BASH 手册 - 3.5.3 Shell 参数扩展

提示:如果您打印了参数的值,您可能会看到目录和文件的列表,并且参数计数“argc”会根据您从哪个目录执行而改变。

于 2012-07-02T10:39:21.083 回答