当 * 作为调用 C 中的程序的参数之一传递时,argc 的值

value of argc when * is passed as one of the arguments calling a program in c

本文关键字:的值 argc 程序 调用 参数      更新时间:2023-10-16

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

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char* argv[])
{
printf("%dn",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

谁能帮我;提前谢谢。

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

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

尝试使用

./t '*'./t *

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

它是将

*扩展到当前目录中的文件列表的 shell。打印出argv以查看情况是否如此。

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

*的情况虽然很特殊,因为您的 shell 将*扩展到本地目录中的所有文件和目录。如果您希望*不扩展,请将其作为双引号"*"传递。

尝试在 shell 中echo *echo "*",看看*是如何扩展的。

这只是

将星号运算符*扩展到当前目录的 shell,从中执行此程序。

在 shell 启动执行之前,会执行几次扩展,例如~(波浪号)、{}(大括号)和$(参数),当然取决于您的操作系统。您可以在下面的链接中找到 GNU 扩展列表。

GNU BASH 手册 - 3.5.3 外壳参数扩展

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