c++ - C 字符串和 std::string 之间的转换导致平台特定方式出现乱码

标签 c++ windows string type-conversion

我今天正在处理一个特定于平台的错误,在这个错误中,在 Windows 机器上某个字符串会非常乱码,但在 Mac 上则不会。该错误与在 std::stringconst char * 之间进行显式和隐式转换的几行有关。基本上,我有一个带有签名的函数

void foo(const std::string &id);

foo 在某些时候打印字符串。在 Windows 上,如果像下面这样调用,它会打印带有不同程度损坏的 id 字符串(混淆前几个字符或整个字符串)

std::string mystring = bar();
const char *id = mystring.c_str();
foo(id); // pass the C style string in because I thought that's what it took

我通过正确调用 foo 更正了错误:

std::string mystring = bar();
foo(mystring);

虽然我无法弄清楚一些事情,比如

  • 错误的来源是什么?
  • 为什么它是特定于平台的?
  • const char *std::string 之间的隐式转换是否安全?

最佳答案

我要大胆猜测一下,你问题中的代码并不代表你的真实代码。症状听起来像是内存被重用,这意味着字符串在 foo 调用时不再有效。您可以通过在临时对象上使用 c_str 来获得它,例如 const char *id = bar().c_str();

关于c++ - C 字符串和 std::string 之间的转换导致平台特定方式出现乱码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17734361/

相关文章:

c++ - 在 SFML 中镜像 Y 轴

c++ - 哈夫曼解码算法

windows - (git bash) 推送到 bitbucket 忽略 SSH key

Windows API CreateDialog : Modeless Dialog just not show up

Java字符串分割删除空值

python - 如何使用定界符将一个字符串拆分为 2 个字符串

c++ - 如何知道链自定义operator<<调用的次数?

c++ - 我在处理我创建的这个对象时遇到错误

c++ - 将 .a 文件转换为 .dll

string - 理论上是否可以在 Swift 中运行用户输入的代码?