我想要向下面这个函数传递参数:
execve(char *filename, char *argv[], char *envp[])
目前我的argv[]
是一个字符串数组。我想将它转换为char* 数组
,以便我可以将它传递给这个函数。
我查找了许多方法来将一个字符串转换为char
数组,但如何将一个字符串数组转换为字符数组数组我想应该是正确的术语。有什么帮助吗?
您需要获取 std::string
内部数据的地址。请注意,这些字符串不需要以空字符结尾,因此您需要确保所有字符串以空字符结尾。另外,作为参数传递的数组 argv
也需要将最后一个元素设置为 null 指针。您可以使用类似以下代码的方式:
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编译时,有一些必要的更改:
nullptr
you need to use 0
.std::string
is not guaranteed to be contiguous, i.e., you need an additional, auxiliary std::vector<char>
to hold a contiguous sequence of characters.There are no functions begin()
and end()
deducing the size of an array but they can easily be implemented in 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; }
The C++03 std::vector<T>
doesn't have a data()
member, i.e., you also need to take the address of the first element.
0
代替nullptr
。当然,你还需要包含相关的标准头文件(在这种情况下是<algorithm>
、<iterator>
、<string>
和<vector>
)。 - Dietmar Kühlreturn s.c_str()
代替s.push_back(0); return &s[0];
是否足够? - anatolyg以下方法对我有效:
const char *argv[]{"-l", nullptr};
execvp("ls", const_cast<char**>(argv));
由于它们是字符串文字,您不需要以 null 结尾,但仍需要在数组末尾添加 null 字符串。
string myargs[5];
这样的形式,并且你想将其传递给execve
函数吗? - us2012char *argv[]
实际上是一个char*
元素的数组。数组中的每个元素都指向一个char*
字符串。因此,argv[0]
是一个char*
字符串,可以被打印或使用。 - enhzflep