1

我有以下程序,我在命令行中传递了 2 个参数,如下所示。我期待 argc 为 3,但它打印为 6。为什么?

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;
void usage();

int main(int argc, char *argv[])
{
    cout << argc << endl;
    if (argc != 3)
            usage();

    string regex = argv[1];
    string searchString = argv[2];

    cout << "regex: " << regex << " . searchString: " << searchString << endl;

    return 0;
}

void usage()
{
    cout << "Usage: ./stringmatch <regex> <searchString>" << endl;
    exit(1);
}

命令行:

[jim@cola c++]$ ./stringmatch [yyyy\d\d\d]* yyyy1234
 6
 Usage: ./stringmatch <regex> <searchString>
4

4 回答 4

7

您的 shell 正在扩展 glob 模式[yyyy\d\d\d]*,因此这导致的实际参数数量取决于当前目录的内容!

成为匹配字符的[yyyy\d\d\d]字符类yand d,并且*匹配后面的任何内容,所以我猜你当前目录有 4 个以yor开头的文件d。要查看它扩展到什么,请使用echo

$ echo [yyyy\d\d\d]*

要使其按预期工作,请引用参数:

$ ./stringmatch '[yyyy\d\d\d]*' yyyy1234
于 2012-12-01T22:11:57.700 回答
2

[yyyy\d\d\d]*由 shell 扩展为与模式匹配的多个文件名。引用它得到 3。

于 2012-12-01T22:11:54.043 回答
2

shell 将您的命令行解析为

./stringmatch [yd]* yyyy1234

它给出了以 y 或 d 加上 yyyy1234 开头的所有文件。因此,如果您有 4 个以 y 和 d 开头的文件加上 yyyy1234 加上 ./stringmatch 将恰好给出 6。

有关详细信息,请参阅文件名扩展和模式匹配

如果您只需要两个参数,则必须用单引号或双引号引用第一个参数

./stringmatch '[yyyy\d\d\d]*' yyyy1234
于 2012-12-01T22:13:12.057 回答
1

因为您的外壳正在扩展参数 - 将它们包装在 '' 中以防止这种情况。

于 2012-12-01T22:12:19.780 回答