2016-12-22 2 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

Edit: Перемещение 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 *. Или push_back каждую строку в вектор и покончить с массивом.

 Смежные вопросы

  • Нет связанных вопросов^_^