C++ 字符串的实例化问题

C++ 字符串的实例化问题,c++,arrays,string,c++11,C++,Arrays,String,C++11,我在实例化字符串和将数组传递给另一个函数时遇到问题。昨天,我有以下代码,它运行良好: string sources[8][3] = { {"ab", "cd","ef"}, {"gh", "ij","kl"}, (...) } 我想将源数组作为参数传递给另一个函数,该函数必须具有以下原型: size_t parse_data(char *ptr, size_t size, size_t nmemb, char *userdata){ 所以这个变量将是u

我在实例化字符串和将数组传递给另一个函数时遇到问题。昨天,我有以下代码,它运行良好:

string sources[8][3] = {
    {"ab", "cd","ef"},
    {"gh", "ij","kl"},
            (...)
}
我想将源数组作为参数传递给另一个函数,该函数必须具有以下原型:

size_t parse_data(char *ptr, size_t size, size_t nmemb, char *userdata){
所以这个变量将是userdata,我将把它转换成一个字符串数组。我决定使用指针,但我不能做得更好:

string** sources;
sources = new string*[8];
sources[0] = new string[3];
sources[0][0] = new string("ab");
有没有更优雅的方法?
谢谢

我不知道你为什么要这样做。但是,由于您列出了
C++11
,因此可以使用以下内容实例化静态:

#include <array>
...
array<array<string, 3>, 8> sources;
当传递指向
parse_data
的c样式字符串指针时,可以对数组项调用
c_str()

例如:
sources[0][0].c_str()


完整示例代码:

#include <array>
#include <iostream>

using namespace std;
int main(int, char **)
{
  array<array<string, 2>, 3> sources { "ab", "cd", "ef", "gh", "ij", "kl"};

  for (size_t i = 0 ; i < sources.size() ; ++i) {
    for (size_t j = 0 ; j < sources[0].size() ; ++j) {
      std::cout << i << "," << j << ": " << sources[i][j] << std::endl;
    }
  }

  return 0;
}
0,0: ab
0,1: cd
1,0: ef
1,1: gh
2,0: ij
2,1: kl

我不知道你为什么要这样做。但是,由于您列出了
C++11
,因此可以使用以下内容实例化静态:

#include <array>
...
array<array<string, 3>, 8> sources;
当传递指向
parse_data
的c样式字符串指针时,可以对数组项调用
c_str()

例如:
sources[0][0].c_str()


完整示例代码:

#include <array>
#include <iostream>

using namespace std;
int main(int, char **)
{
  array<array<string, 2>, 3> sources { "ab", "cd", "ef", "gh", "ij", "kl"};

  for (size_t i = 0 ; i < sources.size() ; ++i) {
    for (size_t j = 0 ; j < sources[0].size() ; ++j) {
      std::cout << i << "," << j << ": " << sources[i][j] << std::endl;
    }
  }

  return 0;
}
0,0: ab
0,1: cd
1,0: ef
1,1: gh
2,0: ij
2,1: kl

从前面的答案中选择swalog,您也可以这样做

std::array<std::array<std::string, 3U>, 8U> strings
{{
    {{"ab", "cd", "ef"}},
    {{"gh", "ij", "kl"}}
}};
然后重新解释回
std::array*

auto-array=*reinterpret\u cast(userData);

然后,很明显,如果调用方在使用数据之前返回(例如,调用不同线程中的函数来使用数据),您需要分配堆上的所有数据,但我想这对于另一个问题线程来说已经足够了…

从前面的答案中提取swalog,您也可以这样做

std::array<std::array<std::string, 3U>, 8U> strings
{{
    {{"ab", "cd", "ef"}},
    {{"gh", "ij", "kl"}}
}};
然后重新解释回
std::array*

auto-array=*reinterpret\u cast(userData);


然后,很明显,如果调用方在使用数据之前返回(例如,调用不同线程中的函数以使用数据),则需要分配堆上的所有数据,但我猜这对于另一个问题线程来说已经足够了…

您试图传递
数组的哪一部分,作为什么参数?代码在概念上是错误的。不能将字符串[][]类型强制转换为char*类型。您可以将字符串[]转换为C字符串数组,或者更改
parse_data
参数。您可以更改parse_data的参数吗?那么函数应该做什么呢?记住数组自然会衰减为指针。因此,只要在调用时将
sources
显式转换为
char*
,并在使用它时,将其转换回指向三个字符串数组的指针,就可以了。除非函数实际期望传递的
userdata
参数是实际的C样式字符串。@JoachimPileborg:这里可能还有其他一些概念问题需要解决,您试图传递
sources
数组的哪一部分,作为什么参数?代码在概念上是错误的。不能将字符串[][]类型强制转换为char*类型。您可以将字符串[]转换为C字符串数组,或者更改
parse_data
参数。您可以更改parse_data的参数吗?那么函数应该做什么呢?记住数组自然会衰减为指针。因此,只要在调用时将
sources
显式转换为
char*
,并在使用它时,将其转换回指向三个字符串数组的指针,就可以了。除非函数实际期望传递的
userdata
参数是实际的C样式字符串。@JoachimPileborg:这里可能还有其他概念问题需要解决,否则您也可以执行
sources[0][0]=“foo”
,这对我来说更自然。谢谢。我会尽快尝试并让您知道。@gd1这就是我在问题中提到的示例中所做的,但这并不优雅,因为有24个值。@user1319182:如果您所指的是
new
3次,那么这与您在示例中所做的不完全一样。当然,使用
sources[i][j]
填充数组是不雅观的,我只是指出
sources[0][0]=“foo”
sources[0][0]=string(“foo”)
相同,这是因为将构造函数转换为@swalog建议的挑剔注释。所以感谢语法,因为它工作得很好,但是我的问题没有解决,因为我无法将参数传递给函数。下面是我收到的错误消息:无法通过“…”传递非普通可复制类型“struct std::array”的对象。仅供参考,您还可以执行
sources[0][0]=“foo”
,这对我来说更自然。谢谢。我会尽快尝试并让您知道。@gd1这就是我在问题中提到的示例中所做的,但这并不优雅,因为有24个值。@user1319182:如果您所指的是
new
3次,那么这与您在示例中所做的不完全一样。当然,使用
sources[i][j]
填充数组是不雅观的,我只是指出
sources[0][0]=“foo”
sources[0][0]=string(“foo”)
相同,这是因为将构造函数转换为@swalog建议的挑剔注释。所以感谢语法,因为它工作得很好,但是我的问题没有解决,因为我无法将参数传递给函数。下面是我收到的错误消息:无法通过“…”传递非普通可复制类型“struct std::array”的对象,谢谢。但是我仍然有一个问题,因为我不能将数组作为参数传递,这就是为什么我首先要使用指针。我得到这个错误:无法通过“…”传递非普通可复制类型“struct std::array”的对象,谢谢。但是我仍然有一个问题,因为我不能将数组作为参数传递,这就是为什么