C++控制台中的星号列出了文件夹中的所有文件,为什么



所以我想创建一个简单的控制台计算器,通过int main(int argc, char ** argv)函数获取参数。它适用于常规示例,但尝试用"*"相乘开始给我带来argv[]中列出的太多参数,所以我修改了一下,发现当使用"*"时,它列出了文件夹中的所有文件,应该是用于乘法。为了调试,我将if语句设置为始终为true。我没有发现cerr有任何问题,尽管我本可以使用try-catch块。

我在互联网上查找了一下原因,发现星号可以用作某种通配符来查找文件夹中的文件,非常相似,但并不完全是我想要的。想法?

源代码:

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char ** argv)
{
cout << "Argument count: " << argc << endl;
if(true) // argc != 4
{
int i(0), j(0);
while(argv[i])
{
j = 0;
while(argv[i][j])
{
cout << argv[i][j];
++j;
}
cout << endl;
++i;
}
}
//cerr << "Inadequate amount of arguments! " << argc;
else
{
double num1, num2;
try
{
num1 = stoi(argv[1]), num2 = stoi(argv[3]);
}
catch(exception e)
{
cout << "Unable to transform to integer.n";
return -1;
}
char op = *argv[2];
switch(op)
{
case '+': cout << num1 + num2; break;
case '-': cout << num1 - num2; break;
case '*': cout << num1 * num2; break;
case '/': cout << num1 / num2; break;
default: cout << "Invalid operator.";
}
}
}

这可能与C++无关,一切都与shell有关。

Bash和其他类似sh的外壳允许您使用";glob";模式,可以轻松命名多个文件。例如,这允许您使用类似mv *.png some-other-dir的命令轻松地将一个目录中的所有.png文件移动到另一个目录。shell用*.png代替当前目录中以"结尾的所有文件的名称;。png";。

CCD_ 5是";匹配任何东西";模式,因此命令中的*将扩展到当前目录中所有文件的名称。这意味着,如果在包含文件"的目录中运行CCD_;my_program""foo.txt";,以及";bar.txt";,您的shell将展开*字符并实际运行./my_program 3 bar.txt foo.txt my_program 4

您可以通过将*字符用单引号括起来或用转义来禁用此扩展。如果运行./my_program 3 '*' 4./my_program 3 * 4,shell将不会展开*,而argv将包含{"./my_program", "3", "*", "4"}


请注意,Windows CMD shell不进行这种扩展。如果你想在Windows上实现这种行为,你必须将你的程序链接到setargv.obj,让运行库为你做这件事,或者自己实现扩展。

在程序启动之前,星号*由shell展开。您无法在程序中更改此行为。对于像Bash、sh、zsh等最流行的shell,你必须引用这样的论点:

program '2*3'

program 2*3

最新更新