【问题标题】:Convert string vector to char array in c++在 C++ 中将字符串向量转换为 char 数组
【发布时间】:2013-10-29 05:38:57
【问题描述】:

我正在尝试将字符串向量转换为 c++ 中的 char 数组。

更具体地说,我正在尝试使用以下命令拆分 shell 命令,例如“ls –latr”:

istringstream f(x);
while (getline(f, x, ' '))
{
    strings.push_back(x);
}

我相信这会给我strings[0] == "ls"strings[1]==" -latr"

我正在尝试执行以下操作:

execvp(strings[0], strings);

但是,我得到了这个错误:

错误:无法将参数“1”转换为“std::basic_string, std::allocator >”为“const char*”到“int execvp(const char*, char* const*)”

因此,我试图弄清楚如何将字符串转换为 char 数组。

【问题讨论】:

  • .c_str()添加到strings[0]的末尾;不过,您仍然需要为第二个参数构建另一个指针向量。
  • 假设字符串是std::vector<std::string>,使用strings[0].c_str()。第二个参数需要一个指针数组,所以更复杂。
  • 不用getline,你可以简单地说while (f >> x) { strings.push_back(x); }

标签: c++


【解决方案1】:

您可以尝试使用std::stringc_str() 方法。它从std::string 类返回类C 字符串,即execvpe 需要的char *。更多详情请查看this link

【讨论】:

    【解决方案2】:

    阅读the manual 会发现“execvp 提供了一个指向以空字符结尾的字符串的指针数组”。所以你需要创建这样一个数组。这是一种方法:

    std::vector<char *> argv(strings.size() + 1);    // one extra for the null
    
    for (std::size_t i = 0; i != strings.size(); ++i)
    {
        argv[i] = &strings[i][0];
    }
    
    execvp(argv[0], argv.data());
    

    【讨论】:

    • 没有足够的转换 :) 我刚刚添加了一个 C++03 证明转换答案。痛苦的东西
    • @sehe:我永远不会被transform 打扰。我总觉得工作量很大,没有收获。
    • @KerrekSB 是的,Boost Range 有transformed,这确实更有用。但是,在 C++11 之前,我认为它经常是“更好的 for_each”
    • 我把它从strings[i].front()改成了strings[i][0]所以它总是正确的,与字符串是否为空无关。
    • @KerrekSB:我对 std::vector 很好,但我仍然无法记住 char *s 是如何初始化的!
    【解决方案3】:

    如果char数组不会改变,可以使用

    strings[0].c_str()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 2021-05-03
      • 2012-10-28
      • 2015-08-01
      • 1970-01-01
      相关资源
      最近更新 更多