У меня есть следующая программа, и я передаю ей 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>
Ваша оболочка расширяет структуру шара [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
[yyyy\d\d\d]*
расширяется оболочкой в несколько имен файлов, соответствующих шаблону. Цитировать это, чтобы получить 3.
Оболочка преобразует вашу командную строку в
./stringmatch [yd]* yyyy1234
который дает все файлы, начинающиеся с y или d плюс yyyy1234. Так что если у вас есть 4 файла, начинающиеся с y и d плюс yyyy1234 plus ./stringmatch, то получится ровно 6.
Увидеть Расширение имени файла и сопоставление с образцом для дополнительной информации.
Если вы хотите всего два аргумента, вы должны заключить первый в одинарные или двойные кавычки
./stringmatch '[yyyy\d\d\d]*' yyyy1234
Поскольку ваша оболочка расширяет аргументы — оберните их в », чтобы предотвратить это.