初始化字符串向量数组时出错

时间:2016-12-22 22:41:41

标签: c++ arrays string vector char

我试图通过首先在char *数组中初始化它来初始化字符串向量,并将它们转换为向量。但是,下面的代码不起作用,向量最终有三个相同的第一个字符串和第四个,第五个和第六个字符串。

string hand_lr_ = "left";
const char* x_joint_names_char[] = {("r2/"+hand_lr_+"_arm/wrist/yaw").c_str(),("r2/"+hand_lr_+"_arm/wrist/pitch").c_str(),("r2/"+hand_lr_+"_arm/hand/index/distal").c_str(),("r2/"+hand_lr_+"_arm/hand/ringlittle/ringMedial").c_str(),("r2/"+hand_lr_+"_arm/hand/ringlittle/ringDistal").c_str(),("r2/"+hand_lr_+"_arm/hand/ringlittle/ring").c_str() };

std::vector<std::string> x_joint_names(x_joint_names_char, x_joint_names_char + sizeof(x_joint_names_char)/sizeof(x_joint_names_char[0]));

for (int i =0; i < sizeof(x_joint_names_char)/sizeof(x_joint_names_char[0]) ;i++) {
  cout << x_joint_names[i] << endl;
  for (int j = 0; j < strlen(x_joint_names_char[i]); j++)
  {
    cout << x_joint_names_char[i][j];
  }
  cout << endl;
}

以上代码输出以下内容。出现一个奇怪的角色。

r2/left_arm/wrist/yaw
8�{
r2/left_arm/wrist/yaw
r2/left_arm/wrist/yaw
r2/left_arm/wrist/yaw
r2/left_arm/wrist/yaw
r2/left_arm/hand/ringlittle/ringMedial
r2/left_arm/hand/ringlittle/ringMedial
r2/left_arm/hand/ringlittle/ringDistal
r2/left_arm/hand/ringlittle/ringDistal
r2/left_arm/hand/ringlittle/ring
r2/left_arm/hand/ringlittle/ring

如果只有五个字符串,代码可以正常工作。如果我不将数组分配给向量,这似乎也很正常。在分配给向量之前,x_joint_names_char中的所有内容都是正确的。不知道是什么原因?

初始化代码基于以下帖子:Initialize a vector array of strings

编辑:     将hand_lr移动到字符串中,如下所示也可以。

const char* x_joint_names_char[] = {("r2/left_arm/wrist/yaw"),("r2/left_arm/wrist/pitch"),("r2/left_arm/hand/index/distal"),("r2/left_arm/hand/ringlittle/ringMedial"),("r2/left_arm/hand/ringlittle/ringDistal"),("r2/left_arm/hand/ringlittle/ring") };

1 个答案:

答案 0 :(得分:4)

初始化x_joint_names_char的行创建了一堆悬空指针。

表达式("r2/"+hand_lr_+"_arm/wrist/yaw")表示一个临时字符串(因为它没有名称而且没有动态分配)。 c_str()函数生成一个指向临时字符串的指针,但是当该行完成时,该行上的临时字符串都将被销毁。

在链接线程中使用char *是一种微优化,只有在初始化器是C风格的字符串文字时才能使用。

从C ++ 11开始,你可以写:

std::vector<std::string> x_joint_names = {
    "r2/"+hand_lr_+"_arm/wrist/yaw",
    "r2/"+hand_lr_+"_arm/wrist/pitch",
    "r2/"+hand_lr_+"_arm/hand/index/distal"
};
例如,

。如果您被迫使用旧的编译器,那么使您的初步数组成为string的数组,而不是const char *的数组。或者push_back将每个字符串放入向量中并取消数组。