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

1 c c++ bash

当'*'作为调用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;
}
Run Code Online (Sandbox Code Playgroud)

我编译它并将其称为 -

dev@ubuntu:~$ gcc test2.c -o t
dev@ubuntu:~$ ./t *
31
Run Code Online (Sandbox Code Playgroud)

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

dev@ubuntu:~$ ./t +
2
Run Code Online (Sandbox Code Playgroud)

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

dev@ubuntu:~$ ./t -*
2
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我;提前感谢.

pho*_*xis 10

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

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

尝试使用

./t '*' 要么 ./t \*

这停止了​​特殊的解释*.第一个使用了bash(看起来像你在bash中)单引号,它没有在引用中的模式中做出任何特殊的解释,而下一个使用转义序列.

  • 此外,字符串` - *`将扩展为以连字符开头的文件名列表(如果存在).如果没有,除非`shopt -s nullglob`生效,否则它将保持字面完整,然后你得到一个空字符串.双引号也可以保护glob字符,但它们允许变量和参数扩展. (2认同)

Raf*_*ird 6

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