如何将字符串数组转换为Char *数组c ++

时间:2013-09-29 20:04:21

标签: c++ c arrays string

所以我想将参数传递给以下函数

execve(char *filename, char *argv[], char *envp[])

目前我的argv[]是一个字符串数组。我想将其转换为char* array,以便将其传递给此函数。

我环顾四周,找到了很多方法将字符串转换为char数组,但是如何将字符串数组转换为char数组的数组我猜是正确的术语 有什么帮助吗?

2 个答案:

答案 0 :(得分:5)

您需要获取std::string内的数据地址。请注意,这些需要以空值终止,即,您需要确保所有字符串都以空值终止。另外,作为argv传递的数组也需要将最后一个元素作为空指针。您可以使用以下代码:

std::string array[] = { "s1", "s2" };
std::vector<char*> vec;
std::transform(std::begin(array), std::end(array),
               std::back_inserter(vec),
               [](std::string& s){ s.push_back(0); return &s[0]; });
vec.push_back(nullptr);
char** carray = vec.data();

使用C ++ 03进行编译时,需要进行一些更改:

  1. 您需要创建一个合适的函数或函数对象,而不是使用lambda表达式。
  2. 您需要使用nullptr
  3. ,而不是使用0
  4. 在C ++ 03 std::string不保证是连续的,即你需要一个额外的辅助std::vector<char>来保存一个连续的字符序列。
  5. 没有函数begin()end()推断数组的大小,但它们可以很容易地在C ++ 03中实现:

    template <typename T, int Size> T* begin(T (&array)[Size]) { return array; }
    template <typename T, int Size> T* end(T (&array)[Size]) { return array + Size; }
    
  6. C ++ 03 std::vector<T>没有data()成员,即您还需要获取第一个元素的地址。

答案 1 :(得分:0)

以下对我有用:

const char *argv[]{"-l", nullptr};
execvp("ls", const_cast<char**>(argv));

由于它们是字符串字面量,因此不需要以空字符结尾,但仍然需要数组末尾的空字符串。