为什么argc返回6而不是3?

时间:2012-12-01 22:10:26

标签: c++ arguments argc

我有以下程序,我在命令行传递了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 个答案:

答案 0 :(得分:7)

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

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

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

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

$ ./stringmatch '[yyyy\d\d\d]*' yyyy1234

答案 1 :(得分:2)

shell将

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

答案 2 :(得分:2)

shell将命令行解析为

./stringmatch [yd]* yyyy1234

给出所有以y或d加yyyy1234开头的文件。因此,如果你有4个以y和d加yyyy1234加上的文件,那么./stringmatch就会给出6个。

有关详细信息,请参阅Filename Expansion and Pattern Matching

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

./stringmatch '[yyyy\d\d\d]*' yyyy1234

答案 3 :(得分:1)

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