如何将值附加到命令行参数数组?

Nod*_*bek 3 c++ arrays argv command-line-arguments

我的应用程序有入口点

int main(int argc, char *argv[])
{

}
Run Code Online (Sandbox Code Playgroud)

我需要扩展 *argv数组n+1并附加一个值。例如,我需要追加"-app_ver"

我是C ++(具有Java背景)的新手。我知道我无法更改数组大小,因此我需要任何解决方案(复制数组等任何方法)

ana*_*lyg 7

要复制您的内容argv,可以使用std::vector的指针char

std::vector<const char*> new_argv(argv, argv + argc);
Run Code Online (Sandbox Code Playgroud)

然后向其中添加新元素:

new_argv.push_back("-app_ver");
new_argv.push_back(nullptr); // or NULL if you are using an old compiler
Run Code Online (Sandbox Code Playgroud)

然后替换argv为新数组:

argv = new_argv.data(); // or &new_argv[0] if you are using an old compiler
argc = argc + 1;
Run Code Online (Sandbox Code Playgroud)

注意:普通参数的末尾应该有一个空指针。它很少使用(尽管标准要求);如果您确定进一步的代码不使用它,并且只想向argv数组中添加一个元素,则可以覆盖null指针,而不用对它进行任何替换argv。也就是说,忽略以上所有代码,只需执行以下操作:

argv[argc++] = "-app_ver";
Run Code Online (Sandbox Code Playgroud)

但是,这很危险-如果您决定再添加一个元素,它将崩溃,并且如果某些代码要求在最后一个参数之后存在空指针,则可能会崩溃。

  • 这是迄今为止解决此问题的最具表现力和 C++ 惯用的方法。自动管理的最小分配,并且仍然可以轻松地与 C API 一起使用。 (2认同)

小智 2

就像 cbuchart 所说,你必须创建一个新的数组或者可能是一个向量。使用向量和字符串对象比 char* 和数组更简单。

示例:

#include <vector>
#include <string>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    vector<string> list;
    for ( int i = 1 ; i < argc ; i++){
        string tmp (argv[i]);
        list.push_back(tmp); // add all arguments to the vector
    }

    cout << "number of given arguments : " << list.size() << endl;

    list.push_back("-app_ver"); // add one string to the vector

    for ( int i = 0 ; i < list.size() ; i++){
        cout << list[i] << endl; // acces data of the vector
    }

}
Run Code Online (Sandbox Code Playgroud)