【问题标题】:How to Concatenate Two LPCSTRs如何连接两个 LPCSTR
【发布时间】:2015-11-08 08:23:18
【问题描述】:

我有两个 LPCSTR 需要像这样连接:

if (!rename(directory + originalFileName, directory + fileName)){
    std::cout<<originalFileName<<std::endl<<fileName<<std::endl<<std::endl;
}

唯一的问题是我不能在这里使用+ 运算符。我怎样才能像这样安全地连接两个 LPCSTR?

编辑:请注意,LPCSTR 定义为const * char,而 LPCTSTR 定义为const TCHAR*。定义 UNICODE 和/或 _UNICODE 时,两者是不同的。在这种情况下,他们是。

【问题讨论】:

  • LPCTSTR 与 LPCSTR 不同
  • 对不起我的错误。我没有注意到多余的 T。
  • std::string(directory).append(originalFileName).c_str() - 使用得当会如你所愿。
  • “两者不同。” - 两者仅在定义 UNICODE 和/或 _UNICODE 时有所不同,您在问题中没有提及。
  • 已编辑。感谢您指出这一点。

标签: c++ concatenation lpcstr


【解决方案1】:

由于这些字符串是 const,您将需要一个新的缓冲区来保存结果。这意味着使用“strlen”查找字符串的长度,使用“new”分配缓冲区,并使用“strcpy”和“strcat”复制字符串

这是如何学习它的提示,而不是我为你编写代码。

此外,还有其他选项,例如使用 std::string 或 CString,具体取决于您的工具集。

【讨论】:

  • 不要偷懒什么的,但是为以后遇到这个问题的人提供代码不是更有建设性吗?
【解决方案2】:

因为LPCSTRCONST CHAR*,所以我使用了这个,

(string(dir) + string(originalFileName)).c_str()

【讨论】:

  • 请注意,这只能在您不使用包含它的 full-expression 末尾的结果时使用
【解决方案3】:

感谢 WhozCraig,我得到了答案:

LPCSTR str1 = "foo",
       str2 = "bar";

std::string(str1).append(str2).c_str();
std::cout<<str1;

返回

foobar

【讨论】:

  • 干得好——我怀疑你不会成为“一个糟糕的程序员”很长时间了!
  • 这个答案是错误的,因为它返回一个悬空指针。使用原始指针时,您必须始终考虑指针指向的对象的生命周期。
【解决方案4】:

您可以使用std::string 类来完成繁重的工作,因为它包含重载的operator+。但是,在尝试读取其内容之前,您必须确保 std::string 对象没有被破坏。

一种方法(在 C++03 中)是:

std::string dest = std::string(directory) + originalFileName;
std::string src = std::string(directory) + fileName;

if (!rename(dest.c_str(), src.c_str())
    // whatever...

首先考虑将directory 存储为std::string

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-29
    • 2014-04-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多