c++ - 从命令行参数指定数组

标签 c++ arrays string command-line

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

我想通过

$ progname array[500]

然后从 argv[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 个元素的空间 block 的指针。

#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 个堆分配 block 并将名称映射到它们:"hello"将映射到指向 500 * sizeof(char) block 的指针, "array"将映射到指向 1000 * sizeof(char) block 的指针, 和 "somelist"将映射到指向 100 * sizeof(char) block 的指针字节。

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

关于c++ - 从命令行参数指定数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3901944/

相关文章:

c++ - 由于管道损坏,Boost asio 发送消息失败

c++ - 在尝试将没有空格的文本文件读取到 C++ 中的二维数组时需要帮助

c++ - 如何使用 STL 翻转/反转二维数组的行或列

c++ - 区分静态数组,指针和结构的C++模板

C++:返回类变量

c++ - 在内联汇编中使用函数范围的标签

php - 将数字加载到 PHP 数组中 - 意外问题

c++ - 如何使用 C++ 从字符串中删除元标记?

c - 限制 C 字符串中十六进制转义序列的长度

c# - 将单词拆分为一组唯一字母