почему argc возвращает 6, а не 3?

У меня есть следующая программа, и я передаю ей 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>

1

Решение

Ваша оболочка расширяет структуру шара [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
7

Другие решения

[yyyy\d\d\d]* расширяется оболочкой в ​​несколько имен файлов, соответствующих шаблону. Цитировать это, чтобы получить 3.

2

Оболочка преобразует вашу командную строку в

./stringmatch [yd]* yyyy1234

который дает все файлы, начинающиеся с y или d плюс yyyy1234. Так что если у вас есть 4 файла, начинающиеся с y и d плюс yyyy1234 plus ./stringmatch, то получится ровно 6.

Увидеть Расширение имени файла и сопоставление с образцом для дополнительной информации.

Если вы хотите всего два аргумента, вы должны заключить первый в одинарные или двойные кавычки

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

Поскольку ваша оболочка расширяет аргументы — оберните их в », чтобы предотвратить это.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector