从命令行参数指定数组

Posted

技术标签:

【中文标题】从命令行参数指定数组【英文标题】:Specify Array from Command Line Argument 【发布时间】:2010-10-10 19:53:19 【问题描述】:

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

我想通过

$ progname array[500]

然后从 argv[1] 中提取字符串,然后根据我读入的内容指定一个数组。

有什么想法吗?

【问题讨论】:

什么意思?你想传递 500 个参数?要不然是啥?我觉得你的问题很难理解 要根据参数分配数组吗? 【参考方案1】:

好吧,根据您的新评论,我将尝试回答这个问题。我这样做大部分是为了向您展示一种可能性,我的代码将进行一些临时的字符串解析并且没有太多的错误检查,这只是为了让您了解如何做到这一点。

如果您希望用户指定您想要创建的数组的大小,这是可行的。

#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" 将映射到指向 @ 块的指针987654329@、"array" 将映射到指向 1000 * sizeof(char) 块的指针,"somelist" 将映射到指向 100 * sizeof(char) 字节块的指针。

上面的代码有一个问题——它没有跟踪为每个指针指向的块分配的字节数,这对你来说毫无价值。一种替代方法是将名称映射到boost::array&lt;Typename T, std::size_t n&gt;,这将是boost 的固定大小array 类,它跟踪其大小并具有size() 成员函数。

【讨论】:

以上是关于从命令行参数指定数组的主要内容,如果未能解决你的问题,请参考以下文章

从命令行创建参数并保存在数组中

在 psql 命令行上传递数组参数

29.命令行参数

C 命令行参数

如何从正在处理的项目文件中访问 msbuild 命令行参数?

Pytest之收集用例及命令行参数