当 * 作为调用 C 中的程序的参数之一传递时,argc 的值
value of argc when * is passed as one of the arguments calling a program in c
当"*"作为调用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"会根据您从哪个目录执行而变化。
- 数组索引的值没有增加
- 'short int'持有的值溢出,但"自动"不会溢出?
- 是默认情况下分配给char数组常量的值
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 为什么我无法更改"set<set>"循环中的值<int>
- 有效地使用std::unordered_map来插入或增加键的值
- <streamsize>C++ 中 numeric_limits::max() 的值
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 无法获取webot::PositionSensor对象中位置传感器的值
- 正在将无序映射设置为无序映射的值
- 着色器纹理值与创建纹理时写入的值不同
- 无法按cpp中的值返回矢量
- 指针没有更新它在void函数内部指向的值
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何在c++中获取要更新的值
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 当 * 作为调用 C 中的程序的参数之一传递时,argc 的值