2016-12-22 58 views
1

我想初始化一個字符串向量,首先在一個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") }; 

回答

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 *。或者將每個字符串放入向量中並刪除數組。