gpt4 book ai didi

c++ - 初始化字符串 vector 数组时出错

转载 作者:行者123 更新时间:2023-11-30 01:41:24 24 4
gpt4 key购买 nike

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

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

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

初始化代码基于这篇文章: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") };

最佳答案

初始化 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 放入 vector 中并删除数组。

关于c++ - 初始化字符串 vector 数组时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41292684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com