【问题标题】:why is argc returning 6 as opposed to 3?为什么 argc 返回 6 而不是 3?
【发布时间】:2012-11-19 19:07:53
【问题描述】:

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

【问题讨论】:

    标签: c++ arguments argc


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • shell 如何处理 [yyyy\d\d\d]* 到?你能解释一下吗?
      • @Jimm 尝试打印出 argv 看看你得到了什么。
      • @Jimm 这叫做“shell globbing”。
      • 但是\d是数字,为什么shell把它当作字符'd'?
      • glob 不是正则表达式,\ 只是转义,没什么神奇的。由于转义字母d 没有意义,因此\d 被简单地解释为d
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        shell 将您的命令行解析为

        ./stringmatch [yd]* yyyy1234
        

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

        更多信息请参见Filename Expansion and Pattern Matching

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

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

        【讨论】:

        • shell的这种行为,是不是因为[]的存在?
        • 这是因为字符集[]和通配符*,见更新答案。
        猜你喜欢
        • 2015-09-06
        • 2010-11-01
        • 2023-02-24
        • 1970-01-01
        • 2015-04-08
        • 2012-08-02
        • 1970-01-01
        • 2021-09-01
        • 2015-11-02
        相关资源
        最近更新 更多