添加多个字符串值

时间:2017-09-11 09:41:01

标签: c++ string templates concatenation

我有这个函数获得3个输入(主要是LPCSTR)并将它们组合在一起并最终返回值:

template<typename T>
inline T  const& LPCombine(T const& lpStr1, T const& lpStr2, T const& lpStr3)
{
    std::string str1, str2, str3, Combined;
    LPCSTR lpCombiend = "";

    str1 = lpStr1;
    str2 = lpStr2;
    str3 = lpStr3;

    Combined = str1 + str2 + str3;

    lpCombiend = Combined.c_str();

    return lpCombiend;
}

如果我在同一个函数中打印lpCombined的值是正确的,字符串或数字连接得那么好但是如果我从另一个函数打印LPCombine函数的返回值,如 main 功能打印的值是奇怪且不可读的东西:

  

╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠

有什么问题?

2 个答案:

答案 0 :(得分:2)

在退出LPCombine功能时销毁合并。因此,LPCombine返回指向已释放内存的指针,并且您有意外行为。也许你需要从函数返回std :: string(使用std :: string作为输入参数)。

答案 1 :(得分:1)

T == LPCSTR,即const char*时,您的函数会返回对原始char指针的const引用。

主要问题是此指针指向函数体中定义的 std::string对象(Combined)的内存:

std::string ..., Combined;
...

lpCombiend = Combined.c_str();

return lpCombiend;

(请注意,您似乎有拼写错误,lpCombiend应为lpCombined。)

当函数终止时,Combined std::string对象被销毁,因此lpCombiend指针指向垃圾。

特别是,在调试版本中使用Visual C ++时,未初始化的内存标有0xCC个字节序列。请注意,0xCC是ASCII代码204 = (框图绘制字符双向垂直和右边),这正是输出中的内容。

因此,您应该考虑返回std::string对象。

我还会质疑模板功能的声明和设计。拥有const T&输入字符串参数真的有意义吗?如果是T,例如PCWSTRconst wchar_t*),您的函数正文中的str1 = lpStr1;作业将无效,因为str1std::string,您无法创建来自std::string原始指针的const wchar_t*