如何将字符串数组转换为 Char * 数组 c++
Posted
技术标签:
【中文标题】如何将字符串数组转换为 Char * 数组 c++【英文标题】:How to Convert a String Array to a Char * Array c++ 【发布时间】:2013-09-29 20:04:21 【问题描述】:所以我想将参数传递给以下函数
execve(char *filename, char *argv[], char *envp[])
目前我的argv[]
是一个字符串数组。我想把它转换成char* array
,这样我就可以把它传递给这个函数了。
我环顾四周,发现了许多将字符串转换为char
数组的方法,但是我想如何将字符串数组转换为 char 数组的数组是正确的术语
有什么帮助吗?
【问题讨论】:
通过字符串数组,你的意思是像string myargs[5];
,你想把它传递给execve
吗?
char *argv[]
实际上是char*
元素的数组。数组中的每个元素都指向一个char*
字符串。因此argv[0]
是一个可以打印/使用的char*
字符串。
@us2012 是的,字符串数组是指字符串数组,如字符串 myargs[5]
【参考方案1】:
您需要获取std::string
s 中数据的地址。请注意,这些不需要以空值结尾,即您需要确保所有字符串都以空值结尾。此外,作为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 编译时,需要进行一些更改:
-
您需要创建一个合适的函数或函数对象来执行相同的转换,而不是使用 lambda 表达式。
您需要使用
0
,而不是使用nullptr
。
在 C++03 中,std::string
不能保证是连续的,也就是说,您需要一个额外的辅助 std::vector<char>
来保存连续的字符序列。
没有函数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;
C++03 std::vector<T>
没有data()
成员,也就是说,您还需要获取第一个元素的地址。
【讨论】:
我是否需要包含任何库这些是我得到的错误'transform'不是'std'的成员'begin'不是'std'的成员错误:'end'是不是“std”警告的成员:lambda 表达式仅适用于 -std=c++0x 或 -std=gnu++0x [默认启用] 'nullptr' 未在此范围内声明 您需要使用 C++11 选项编译或使用函数对象而不是 lambda 表达式和0
而不是 nullptr
。当然,您还需要包含相关的标准标头(在本例中为 <algorithm>
、<iterator>
、<string>
和 <vector>
)。
我已经包含了vector和iostream并使用了命名空间std
即使在包含 -std=c++11
或-std=c++0x
。在这种情况下,您可能需要定义 begin()
和 end()
函数。【参考方案2】:
以下内容对我有用:
const char *argv[]"-l", nullptr;
execvp("ls", const_cast<char**>(argv));
由于它们是字符串字面量,因此您不需要以空值终止它们,但您仍然需要在数组末尾使用空字符串。
【讨论】:
以上是关于如何将字符串数组转换为 Char * 数组 c++的主要内容,如果未能解决你的问题,请参考以下文章