gpt4 book ai didi

c++ - 将 std::string 拆分为两个 const char* 导致第二个 const char* 覆盖第一个

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:16:21 25 4
gpt4 key购买 nike

我正在输入一行由空格分隔的输入,并尝试将数据读入两个整数变量。

例如:“0 1”应该给 child1 == 0child2 == 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_strchild2_str 显示为具有不同的内存位置(它们应该如此)。在 separator 处拆分字符串并获得第一个值后,child1_str 按预期保留“0”。

但是,下一行为 child2_str 赋值不仅为 child2_str 赋了正确的值,而且还覆盖了 child1_str。我什至不是说字符值被覆盖,我的意思是调试器显示 child1_strchild2_str 共享内存中的相同位置。

什么什么?

1) 是的,我很乐意听取其他将字符串转换为 int 的建议——这就是我很久以前学会的方法,而且我从来没有遇到过问题,所以永远不需要改变,但是:

2) 即使有更好的方法来执行转换,我仍然想知道这里发生了什么! 这是我的终极问题。所以即使你想出了更好的算法,选择的答案也将是帮助我理解为什么我的算法失败的答案。

3) 是的,我知道 std::string 是 C++ 而 const char* 是标准 C。atoi 需要一个 C 字符串。我将其标记为 C++,因为输入绝对是来 self 正在使用的框架的 std::string。

最佳答案

首先,卓越的解决方案。

在 C++11 中,您可以使用新奇的 std::stoi 功能:

int child1 = std::stoi(input.substr(0, separator));

否则,您可以使用 boost::lexical_cast :

int child1 = boost::lexical_cast<int>(input.substr(0, separator));

现在,一个解释。

input.substr(0, separator)创建一个临时 std::string 在分号处 结束的对象。打电话c_str()在该临时对象上为您提供了一个指针,该指针仅在临时对象存在期间有效。这意味着,在下一行,指针已经无效。取消引用该指针具有未定义的行为。然后奇怪的事情发生了,就像未定义行为的情况一样。

关于c++ - 将 std::string 拆分为两个 const char* 导致第二个 const char* 覆盖第一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11315699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com