我有以下程序,我在命令行传递了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>
答案 0 :(得分:7)
您的shell正在扩展glob模式[yyyy\d\d\d]*
,因此实际产生的参数数量取决于当前目录的内容!
[yyyy\d\d\d]
成为匹配字符y
和d
的字符类,*
匹配后面的任何内容,所以我猜你当前的目录有4个以y
或d
开头的文件。要查看它扩展到的内容,请使用echo
:
$ echo [yyyy\d\d\d]*
要使其按预期工作,请引用参数:
$ ./stringmatch '[yyyy\d\d\d]*' yyyy1234
答案 1 :(得分:2)
[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正在扩展参数 - 将它们包装在''中以防止这种情况。