Укажите массив из аргумента командной строки - PullRequest
1 голос
/ 10 октября 2010

Я понимаю, что каждый аргумент, переданный из командной строки, сохраняется как строка в 'char * argv []'

Я хотел бы передать

$ progname array[500]

и извлеките строку из argv [1], указав впоследствии массив на основе того, что я прочитал.

Есть идеи?

1 Ответ

0 голосов
/ 11 октября 2010

Ну из вашего нового комментария я постараюсь ответить на вопрос. Я делаю большую часть этого, чтобы показать вам одну возможность, мой код будет иметь некоторый временный разбор строк и не так много проверок на ошибки, это просто, чтобы дать вам представление о том, как вы можете это сделать.

Если вы хотите, чтобы пользователь указал размер массива, который вы хотите создать, это выполнимо.

#include <iostream>
#include <cstdlib>

int main(int argc, char **argv)
{
   if (argc < 2) // the program's name is the first argument
   {
      std::cerr << "Not enough arguments!\n";
      return -1;
   }

   int arraySize = std::atoi(argv[1]);

   char *cArray = new char[arraySize];

   delete [] cArray;

   return 0;
}

Если вы запустите вышеупомянутую программу и передадите ей аргумент 500, она выделит блок памяти для хранения до 500 * sizeof(char).

Если вы хотите, чтобы пользователь фактически дал вам имя массива и его размер, это немного отличается - вы не можете создать имя переменной во время выполнения. Единственное, что вы можете сделать, это отобразить строки в массивы.

Вот программа, которая принимает список аргументов, состоящий из таких аргументов, как hello[100], и создает отображение hello на указатель на блок пространства для 100 элементов.

#include <iostream>
#include <cstdlib>
#include <map>
#include <string>
#include <boost/shared_ptr.hpp>

int main(int argc, char **argv)
{
    std::map<std::string, boost::shared_ptr<char> > arrayMap;

    for(int i = 1; i < argc; ++i)
    {
       // arguments are like 'hello[500]', 'array[100]
       std::string s = argv[i];
       std::size_t posOpen = s.find("[");
       std::size_t posClose = s.find("]");

       std::string name = s.substr(0, posOpen);

       std::string size = s.substr(posOpen, posClose);

       // remove the '[' and ']' characters
       size.erase(0, 1);
       size.erase(size.length()-1, 1);

       std::cout << name << " " << size << std::endl; 

       // allocate our new array and wrap a shared_ptr around it
       boost::shared_ptr<char> cptr(new char[std::atoi(size.c_str())]);

       arrayMap[name] = cptr;

    }

    // now you can access the arrays 'by name'

    return 0;
}

Если вы запустили приведенный выше код и передали ему список аргументов, таких как hello[500] array[1000] somelist[100], это создаст 3 выделенных кучи блока и отобразит им имена: "hello" отобразит указатель на блок 500 * sizeof(char), "array" будет отображаться на указатель на блок 1000 * sizeof(char), а "somelist" будет отображаться на указатель на блок 100 * sizeof(char) байтов.

Однако существует проблема с этим кодом выше - он не отслеживает количество байтов, выделенных для каждого указательного блока указателя, что делает его довольно бесполезным для вас. Одной из альтернатив будет сопоставление имен с boost::array<Typename T, std::size_t n>, который будет классом фиксированного размера boost array, который отслеживает его размер и имеет функцию-член size().

...