Я беру строку ввода, разделенную пробелом, и пытаюсь прочитать данные в две целочисленные переменные.
например: "0 1" должно дать child1 == 0
, child2 == 1
.
Код, который я использую, выглядит следующим образом:
int separator = input.find(' ');
const char* child1_str = input.substr(0, separator).c_str(); // Everything is as expected here.
const char* child2_str = input.substr(
separator+1, //Start with the next char after the separator
input.length()-(separator+1) // And work to the end of the input string.
).c_str(); // But now child1_str is showing the same location in memory as child2_str!
int child1 = atoi(child1_str);
int child2 = atoi(child2_str); // and thus are both of these getting assigned the integer '1'.
// do work
То, что происходит, меня бесконечно озадачивает. Я отслеживаю последовательность с помощью отладчика Eclipse (gdb). Когда функция запускается, показано, что child1_str
и child2_str
имеют разные ячейки памяти (как и должно быть). После разделения строки на separator
и получения первого значения child1_str
содержит '0', как и ожидалось.
Однако следующая строка, которая присваивает значение child2_str
, не только присваивает правильное значение child2_str
, но и перезаписывает child1_str
. Я даже не имею в виду, что значение символа перезаписывается, я имею в виду, что отладчик показывает, что child1_str
и child2_str
занимают одно и то же место в памяти.
Что что?
1) Да, я буду рад выслушать другие предложения по преобразованию строки в int - так я научился делать это давным-давно, и у меня никогда не было с этим проблем, поэтому никогда не нужно изменить, однако:
2) Даже если есть лучший способ выполнить преобразование, я все равно хотел бы знать, что здесь происходит! Это мой главный вопрос. Поэтому, даже если вы придумаете лучший алгоритм, выбранный ответ будет тем, который поможет мне понять, почему мой алгоритм не работает.
3) Да, я знаю, что std::string — это C++, а const char* — стандарт C. atoi требует строки c. Я помечаю это как C++, потому что входные данные абсолютно точно будут поступать в виде std::string из фреймворка, который я использую.