在代码中创建argc argv

时间:2016-10-05 20:51:48

标签: c++ argv argc

嗨,这是一个非常新手的问题,但我无法弄清楚:

我有一个名为bar的函数

class foo
{
    public:
        bool bar(int argc, char** argv);
}

argv应该包含

"--dir" and "/some_path/"

如何创建argv和argc以便将它们传递到bar()?我尝试了很多方法,但我无法正确获取指针和类型转换。

所以我没有从命令行获取argv,而是想在代码中创建它。

感谢您的任何意见!

3 个答案:

答案 0 :(得分:9)

我最喜欢的方式是这样的:

std::vector<std::string> arguments = {"--dir", "/some_path"};

std::vector<char*> argv;
for (const auto& arg : arguments)
    argv.push_back((char*)arg.data());
argv.push_back(nullptr);

f.bar(argv.size() - 1, argv.data());

注意,如果参数是静态的并且不会改变,那么这有点过分。但这种方法具有符合RAII的优点。它为您管理内存并在适当的时候删除对象。因此,如果参数列表是动态的,那么它是最干净的方式。

除此之外,如果f.bar修改argv数组中的数据,则此代码在技术上是UB。通常情况并非如此。

答案 1 :(得分:1)

假设您希望argc和argv采用与main相同的格式,您可以这样调用它:

foo f;
char *args[] = {
    (char*)"--dir",
    (char*)"/some_path/",
    NULL
};
f.bar(2, args);

(注意:这假定bar不会修改参数字符串 - 在这种情况下,您应该将参数类型更改为const char **而不是char **

答案 2 :(得分:0)

使用类字符串太强大了:

#include <iostream>
#include <string>

class foo
{
    public:
        void bar(int argc, std::string* argv);
};

void foo::bar(int argc, std::string* argv)
{
    //do somwthing
    for(int i(0); i < argc; i++)
        std::cout << "argv[" << i << "]: " << argv[i] << std::endl;
}


int main()
{


    int argc;
    std::cout << "Enter number of parameters: ";
    std::cin >> argc;
    std::cout << std::endl;
    std::cin.ignore(1, '\n');

    std::string* sArgv = new std::string[argc];

    for(int i(0); i < argc; i++)
    {
        std::cout << "argv[" << i << "]: ";
        std::getline(std::cin, sArgv[i]);
        std::cout << std::endl;
        std::cin.ignore(1, '\n');
    }


    foo theFoo;
    theFoo.bar(argc, sArgv);

    delete[] sArgv;
    sArgv = NULL;

    std::cout << std::endl;

    return 0;
}