スペースで区切られた入力行を取得し、データを 2 つの整数変数に読み取ろうとしています。
たとえば、「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 には ac 文字列が必要です。入力は、使用しているフレームワークから std::string として絶対に来るため、これを C++ としてタグ付けしています。