2010-10-10 48 views
0

我知道在命令行传递的每个参数被存储为“的char * argv的[]”的字符串从命令行参数指定

我想通过

$ progname array[500] 

阵列和从argv [1]拉出字符串,然后根据我读的内容指定一个数组。

任何想法?

+1

你是什么意思?你想传递500个参数?或者是什么?我认为你的问题很难理解 – 2010-10-10 19:57:33

+0

你想根据参数分配一个数组吗? – birryree 2010-10-10 19:59:04

+0

@kuropenguin正好 – Drew 2010-10-11 00:39:27

回答

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>,这将是助推器的固定尺寸的array类,该类跟踪其大小并具有size()成员函数。