从命令行参数指定数组

时间:2010-10-10 19:53:20

标签: c++ arrays string command-line

我意识到从命令行传递的每个参数都存储为'char * argv []'中的字符串

我想通过

$ progname array[500]

并从argv [1]中拉出字符串,随后根据我读到的内容指定一个数组。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

从你的新评论中,我会尽力回答这个问题。我正在做的大部分工作都是为了向你展示一种可能性,我的代码将有一些临时的字符串解析,而且没有太多的错误检查,它只是让你知道如何做到这一点。

如果您希望用户指定您想要制作的数组的大小,那就是可行的。

#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()成员函数。