【问题标题】:Dealing with char ** argv处理 char ** argv
【发布时间】:2011-01-04 02:16:37
【问题描述】:

如何将字符串序列分配给程序中的 char ** argv 变量?它是一个命令行参数。我目前正在尝试将 .exe 应用程序转换为 dll。

例如:

{ "string1", "string2", "string3" } ---> char ** argv 变量

我的问题与此有关: How does an array of pointers to pointers work? 但我无法使用那里显示的 sn-p 让它工作。救命!

【问题讨论】:

  • 您是在尝试将三个命令行参数分配给程序中的三个单独的 char* 变量,还是尝试将三个变量分配给您自己声明的 char**?
  • 我正在尝试将 3 个字符串分配给我声明的 char**。我可能还会在程序的后面部分重新分配不同的字符串序列。这样做的正确方法是什么?
  • 为什么要修改传入的参数?

标签: c++ arrays command-line pointers arguments


【解决方案1】:

const char* argv[] = {"string1", "string2", "string3", 0};

如果参数不是编译时间常数,我会这样做:

std::vector<const char*> arguments;
arguments.push_back(somePointer);
arguments.push_back(someOtherPointer);
arguments.push_back(0);
const char** argv = &arguments[0];

编辑:使用 PaxDiablos 信息,argv-array 应为空终止。

【讨论】:

  • @Andreas,如果它是一个真正的 argv(正如 main 所期望的那样),它应该有第四个指针设置为 NULL。但是,这可能不是这种情况的要求的一部分。
  • 那更好,删除我的,因为它现在没有添加任何新内容(而且因为它使用 malloc - 啊!)。
  • 我不记得它们是如何在内部存储的,但在这个例子中 std::vector<:string> 可以使用吗?
  • @John 不,没有办法直接将 std::vector&lt;std::string&gt; 传递给期望 char** 的函数。
【解决方案2】:

getopt 呢?

【讨论】:

    【解决方案3】:

    请注意,Andreas Brincks 的答案确实是您想要做的,其中 vector 完成了所有繁重的分配工作并提供了异常安全性。我强烈建议您考虑更改无法使用矢量的任何原因。但是如果你真的不能这样做,我想你可以按照下面的代码做一些事情:

    int numArgs = YOUR_NUMBER_HERE;
    
    char **myArgv = new char*[numArgs+1];
    
    for (int i=0; i<numArgs; ++i) {
        myArgv[i] = new char[at least size of your argument + 1];
        strncpy(myArgv[i], whereever your string is, buffer size);
        myArgv[buffer size] = '\0';
    }
    myArgv[numArgs] = NULL;
    
    
    // use myArgv here
    
    
    // now you need to manually free the allocated memory
    for (int i=0; i<numArgs; ++i) {
        delete [] myArgv[i];
    }
    delete [] myArgv;
    

    【讨论】:

      猜你喜欢
      • 2011-07-08
      • 2015-10-24
      • 2022-07-14
      • 2010-10-21
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      相关资源
      最近更新 更多