【问题标题】:What is the most efficient way to convert STL string array to const char* array?将 STL 字符串数组转换为 const char* 数组的最有效方法是什么?
【发布时间】:2010-07-08 19:54:12
【问题描述】:

我们有:

 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[]”?

【问题讨论】:

  • 索引在 C++ 中为 0。所以你的意思是string_array[0]string_array[1]
  • 函数如何使用const char* cstring_array[]?
  • 在图书馆。我不知道,但我敢肯定,它不会修改它。

标签: c++ arrays cstring stdstring


【解决方案1】:

采用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());
}

【讨论】:

  • 对不起,我犯了一个错误。函数需要 const char* array[]。 const char* 字符串的数组。
【解决方案2】:

使用string::c_str 获取指向字符的常量指针。

【讨论】:

  • 对不起,我犯了一个错误。函数需要 const char* array[]。 const char* 字符串的数组。
【解决方案3】:

只需使用:
string_array[0].c_str()
string_array[1].c_str()

c_str():

const charT* c_str() const basic_string 返回一个指针 到一个以 null 结尾的数组 代表字符串的字符 内容。

【讨论】:

  • 对不起,我犯了一个错误。函数需要 const char* array[]。 const char* 字符串的数组。
【解决方案4】:

您可以通过将 string_array[1].c_str() 传递给任何需要该字符串的函数来访问 c 字符串版本。

但是请注意,返回的指针取决于 stl::string!如果你取指针然后释放字符串,你将得到一个无效的指针

【讨论】:

  • 或者即使你修改了字符串而不释放它。缓冲区可以被释放并替换为更大的缓冲区。
  • 对不起,我犯了一个错误。函数需要 const char* array[]。 const char* 字符串的数组。
【解决方案5】:

两个不同的问题,真的。要传递给函数,只需调用c_str()。要复制过来,只需调用 strncpy() 并记住我所说的关于传递给函数的内容。

请记住,std::string 可以包含 '\0' 而不会实际终止。在这种情况下,您只会得到字符串的一部分。如果您尝试复制此类数据,则需要改用memcpy()

【讨论】:

  • 对不起,我犯了一个错误。函数需要 const char* array[]。 const char* 字符串的数组。
  • 然后您需要将它们单独复制到数组中。没有一组函数可以暂时将一个转换为另一个。
  • 也许有办法访问内存,分配在 STL 字符串中?还有一些“魔法”让这个内存看起来像 const char* 数组?我是一个deramer =))
  • @hoxnox - 当然有。 c_str() 或数据()。你想要的是一个字符串数组变成一个字符数组数组,这是不可能的。即使你通过一些时髦的演员(这很容易)尝试它,内部缓冲区之间的距离也不会是你需要的 sizeof(char*)。
【解决方案6】:

您似乎在使用数组时遇到了一些问题。正如 Brian 指出的那样,数组索引从 0 开始,而不是 1。因此,您的两个 stringsstring_array[0]string_array[1]not string_array[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 数组(这是我对问题的解释的可能性),那么您真正想要做的是您想要生成一个字符串是你原来的两个的串联:

...
std::string str = string_array[0] + string_array[1];

myFunction (str.c_str( ));
...

希望有帮助!

编辑:考虑到自从我写这篇文章以来出现的 cmets,我想说第一个例子接近你所需要的。我会执行以下操作(其中 N 是任一数组中的条目数):

...
for (int i = 0; i < N; i++)
    cstring_array[i] = string_array[i].c_str( );

myFunction (cstring_array);
...

这是唯一可行的方法。没有标准函数(AFAIK),给定string 的数组将给出char* 的数组。我怀疑原因是: - 这不是需要经常做的事情,因此很少需要广泛使用这样的功能。 - 如果有这样的功能,无论如何它很可能与上面的非常相似,在这种情况下它是如此琐碎以至于没有必要。

基本上,要回答您的问题,我认为没有更有效的方法,即使有标准库函数可以做到这一点,它无论如何都会使用这种方法。

【讨论】:

  • >for (int i = 0; i cstring_array[i] = string_array[i].c_str( );但是,在这种情况下,我必须为 cstring_array 分配内存。也许有更好的方法?获取由 STL 字符串数组分配的内存,或者 smth...?
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多