我们有:
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[]
”?
答案 0 :(得分:12)
一个只占char const *
的函数只能写入一次接受一个字符串,而不是字符串数组。要将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());
}
答案 1 :(得分:4)
使用string::c_str
获取指向char的const指针。
答案 2 :(得分:3)
简单地使用:
string_array[0].c_str()
string_array[1].c_str()
请参阅c_str():
const charT * c_str() const basic_string返回一个指针 到以null结尾的数组 代表字符串的字符 内容。
答案 3 :(得分:1)
您可以通过将string_array [1] .c_str()传递给需要字符串的任何函数来访问c-string版本。
但请注意,返回的指针依赖于stl :: string!如果你拿指针然后释放字符串,你将有一个无效的指针
答案 4 :(得分:0)
真的有两个不同的问题。要传递给函数,只需调用c_str()
即可。复制只需调用strncpy()
并记住我所说的关于传递给函数的内容。
请记住,std :: string可以包含'\ 0'而不实际终止。在这种情况下,你只会获得部分字符串。如果您要复制此类数据,则需要使用memcpy()
。
答案 5 :(得分:0)
看起来你在使用数组时遇到了一些麻烦。正如Brian指出的那样,数组索引从0开始而不是1.因此,你的两个strings
是string_array[0]
和string_array[1]
,不是 string_array[1]
和{{ 1}}。
此外,如果您的函数采用参数string_array[2]
,那么您的变量const char* cstring_array
可能不是您想要的。如果你原样传入它,你基本上会传入一个char* cstring_array[2]
,而不是char**
,因为你可以认为一个数组的名称等同于一个指针它的第一个元素。
当您提出问题时,可以执行以下操作(纠正索引错误,并假设您提到的函数称为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
希望有所帮助!
编辑:鉴于我写这篇文章后出现的评论,我会说第一个例子接近你所需要的。我将执行以下操作(其中N是任一数组中的条目数):...
std::string str = string_array[0] + string_array[1];
myFunction (str.c_str( ));
...
这是唯一可行的方法。没有标准函数(AFAIK),给定...
for (int i = 0; i < N; i++)
cstring_array[i] = string_array[i].c_str( );
myFunction (cstring_array);
...
数组将给出string
数组。我怀疑原因是:
- 这不是经常需要做的事情,所以几乎没有人要求广泛提供这样的功能。
- 如果有这样的功能,它很可能与上面的内容非常相似,在这种情况下它是如此微不足道,以至于没必要。
基本上,为了回答你的问题,我认为没有更有效的方法,即使有一个标准的库函数来执行此操作,它仍然会使用这种方法。