我们有:
std::string string_array[2];
string_array[0] = "some data";
string_array[1] = "some more data";
char* cstring_array[2];
将数据从 string_array 复制到 cstring_array 的最有效方法是什么?或者将 string_array 传递给函数,需要“ const char* cstring_array[]
”?
接受a 的函数一次char const *
只接受一个字符串,而不是字符串数组。要将 an 传递std::string
给这样的函数,只需调用函数your_string.c_str()
作为参数。
编辑:对于一个接受字符串数组的函数,显而易见的选择(至少对我来说)是编写一个最小的前端,让你传递一个vector<std::string>
:
// The pre-existing function we want to call.
void func(char const *strings[], size_t num) {
for (size_t i=0;i<num; i++)
std::cout << strings[i] << "\n";
}
// our overload that takes a vector<string>:
void func(std::vector<std::string> const &strings) {
std::vector<char const *> proxies(strings.size());
for (int i=0; i<proxies.size(); i++)
proxies[i] = strings[i].c_str();
func(&proxies[0], proxies.size());
}
用于string::c_str
获取指向 char 的 const 指针。
只需使用:
string_array[0].c_str()
string_array[1].c_str()
见c_str():
const charT* c_str() const basic_string 返回指向以空字符结尾的表示字符串内容的字符数组的指针。
您可以通过将 string_array[1].c_str() 传递给任何需要该字符串的函数来访问 c 字符串版本。
但是请注意,返回的指针取决于 stl::string!如果你取指针然后释放字符串,你将得到一个无效的指针
两个不同的问题,真的。要传递给函数,只需调用c_str()
. 复制简单地调用strncpy()
并记住我所说的关于传递给函数的内容。
请记住,std::string 可以包含 '\0' 而不会实际终止。在这种情况下,您只会得到字符串的一部分。如果您尝试复制此类数据,则需要使用memcpy()
。
看起来您在使用数组时遇到了一些问题。正如布赖恩指出的那样,数组索引从 0 而不是 1 开始。因此你的两个strings
是string_array[0]
and string_array[1]
,不是 string_array[1]
and string_array[2]
。
此外,如果您的函数需要一个参数const char* cstring_array
,那么您的变量char* cstring_array[2]
可能不是您想要的。如果您按原样传递它,则本质上是传递 a char**
,而不是 a char*
,因为您可以认为数组的名称等同于指向其第一个元素的指针。
当您提出问题时,您可以执行以下操作(更正索引错误,并假设您提到的函数被调用myFunction
):
...
cstring_array[0] = string_array[0].c_str( );
cstring_array[1] = string_array[1].c_str( );
myFunction (cstring_array[0]);
myFunction (cstring_array[1]);
...
但是,根本不需要的更简单的等价物cstring_array
是:
...
myFunction (string_array[0].c_str( ));
myFunction (string_array[1].c_str( ));
...
或者,如果您的意图是传递包含两个字符串的单个char
数组(这是我对问题的解释的一种可能性),那么您真正想要做的是您想要生成一个字符串作为原始字符串的串联二:
...
std::string str = string_array[0] + string_array[1];
myFunction (str.c_str( ));
...
希望有帮助!
编辑:鉴于我写这篇文章以来出现的评论,我想说第一个例子接近你所需要的。我会执行以下操作(其中 N 是任一数组中的条目数):
...
for (int i = 0; i < N; i++)
cstring_array[i] = string_array[i].c_str( );
myFunction (cstring_array);
...
这是唯一可能的方法。没有标准函数(AFAIK),给定一个数组string
将给出一个char*
. 我怀疑原因是: - 这不是需要经常做的事情,所以很少需要广泛使用这样的功能。- 如果有这样的功能,它很可能与上面的非常相似,在这种情况下,它是如此微不足道以至于没有必要。
基本上,要回答您的问题,我认为没有更有效的方法,即使有一个标准库函数可以做到这一点,它仍然会使用这种方法。