将字符串连接到char *

时间:2015-08-04 14:40:40

标签: c++ string scope

我是一名C#开发人员,当我在C ++中运行以下代码时,我感到很奇怪:

std::string original = "Hello";

std::string st = original + "World";
const char *c = st.c_str();

const char *c2 = (original + "World").c_str();

std::cout << "c  = '" << c << "'" << std::endl;
std::cout << "c2 = '" << c2 << "'" << std::endl;

我得到以下输出:

c  = 'HelloWorld'
c2 = ''

在C#中,类似的构造将导致cc2具有相同的值(&#34; Hello World&#34;)。我的猜测是(original + "World")的结果范围在右)结束,因此在无效输入上调用c_str()。那是对的吗?除了创建变量以保存临时结果之外,还有更好的方法来实现这一目标吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

  

我的猜测是(原始+“世界”)结果的范围在右边结束),因此在无效输入上调用c_str()。这是对的吗?

不完全,但很接近。 c_str()本身很好,但是在语句结束后该指针变为无效,因此之后使用c2会导致UB。

  

除了创建变量以保存临时结果之外,还有更好的方法来实现这一目标吗?

您可以将其分配给const引用:

const std::string &ref = original + "World";
const char *c2 = ref.c_str();

但我认为没有比创建变量更好的了。

答案 1 :(得分:2)

&#39; C2&#39;这里初始化为指向临时对象的指针,该对象不再存在于分号中。因此,这是未定义的行为。您需要使用中间变量:

const auto temp(original + "World");
const char* c2 = temp.c_str();