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