C++ 控制台中的 Asterisk 列出了文件夹中的所有文件,为什么?
Asterisk in C++ console lists all files in folder, why?
所以我想创建一个简单的控制台计算器,它通过 int main(int argc, char ** argv)
函数接受参数。它适用于常规示例,但尝试与“*”相乘开始给我 argv[] 中列出的参数太多,所以我四处修改并发现它在使用“*”时列出了文件夹中的所有文件,据说用于乘法。我将 if 语句设置为 always 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-like shell 允许您使用“glob”模式轻松命名多个文件。例如,这允许您使用 mv *.png some-other-dir
等命令轻松地将一个目录中的所有 .png 文件移动到另一个目录。 shell 将当前目录中以“.png”结尾的所有文件的名称替换为 *.png
。
*
是“匹配任何内容”模式,因此命令中的 *
将扩展为当前目录中所有文件的名称。这意味着如果您在包含文件“my_program”、“foo.txt”和“bar.txt”的目录中 运行 ./my_program 3 * 4
,您的 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 上的这种行为,你必须 link 你的程序到 setargv.obj 才能让 运行time 库为你做这件事或自己实现扩展。
星号 *
由 shell 在 程序启动之前扩展。您无法在程序中执行任何操作来更改此行为。对于最流行的 shell,如 Bash、sh、zsh 等,您必须像这样引用参数:
program '2*3'
或
program 2\*3
所以我想创建一个简单的控制台计算器,它通过 int main(int argc, char ** argv)
函数接受参数。它适用于常规示例,但尝试与“*”相乘开始给我 argv[] 中列出的参数太多,所以我四处修改并发现它在使用“*”时列出了文件夹中的所有文件,据说用于乘法。我将 if 语句设置为 always 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-like shell 允许您使用“glob”模式轻松命名多个文件。例如,这允许您使用 mv *.png some-other-dir
等命令轻松地将一个目录中的所有 .png 文件移动到另一个目录。 shell 将当前目录中以“.png”结尾的所有文件的名称替换为 *.png
。
*
是“匹配任何内容”模式,因此命令中的 *
将扩展为当前目录中所有文件的名称。这意味着如果您在包含文件“my_program”、“foo.txt”和“bar.txt”的目录中 运行 ./my_program 3 * 4
,您的 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 上的这种行为,你必须 link 你的程序到 setargv.obj 才能让 运行time 库为你做这件事或自己实现扩展。
星号 *
由 shell 在 程序启动之前扩展。您无法在程序中执行任何操作来更改此行为。对于最流行的 shell,如 Bash、sh、zsh 等,您必须像这样引用参数:
program '2*3'
或
program 2\*3