我正在输入一行由空格分隔的输入,并尝试将数据读入两个整数变量。
例如:“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 字符串。我将其标记为 C++,因为输入绝对来自我正在使用的框架中的 std::string。