在C++中将字符串向量转换为字符数组

5

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

更具体地说,我想要做的是通过使用以下内容来拆分shell命令,例如“ls -latr”:

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

我相信这会给我strings[0] == "ls"strings[1]==" -latr"
接下来,我尝试执行以下操作:
execvp(strings[0], strings);

然而,我遇到了这个错误:

错误:不能将“std::basic_string,std :: allocator >”转换为“const char *”,用于参数“1”,以便“int execvp(const char *,char * const *)”

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


strings[0] 的末尾添加 .c_str();但是你仍然需要为第二个参数构建另一个指针向量。 - Kal
假设字符串是一个std::vector<std::string>,使用strings[0].c_str()。第二个参数需要一个指针数组,因此更复杂。 - Roddy
你可以用 while (f >> x) { strings.push_back(x); } 代替 getline。 - Kerrek SB
3个回答

7

阅读 手册 可以发现,"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());

3
不够转换 :) 我刚刚添加了一个 C++03 证明变换的答案。很痛苦的东西。 - sehe
@sehe:我总觉得transform很麻烦,而且没有什么好处。 - Kerrek SB
@KerrekSB 而且 transform 在这里很自然,特别是与 lambda 一起使用。为什么要写三四行代码,当只需要一行就足够,并且更清晰地表达你正在做什么呢? - James Kanze
@KerrekSB 是的,但再次强调,这更加明确。该函数_不会_修改字符串,并且const_cast明确表示您正在适应遗留接口。(顺便说一下,我会在调用execv的地方进行转换。) - James Kanze
@JamesKanze:我尝试了几种替代方案,但都不喜欢:范围循环、转换、后插入器……没有一种看起来比现在的代码更容忍。但请继续发布您自己的方法! - Kerrek SB
显示剩余11条评论

1
你可以尝试使用std::stringc_str()方法。它会返回std::string类的C语言风格字符串,即char *,这是你需要用于execvpe的。查看此链接以获取更多详细信息。

0
如果字符数组不会被更改,您可以使用:
strings[0].c_str()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接