C++ 中的 const 正确性仍然让我头疼。在处理一些旧的 C 代码时,我发现自己需要将 C++ 字符串对象赋值为 C 字符串并将其分配给变量。但是,变量是 char *
并且 c_str()
返回一个 const char []
。有没有一种很好的方法来解决这个问题而不必滚动我自己的功能来做到这一点?
编辑: 我也试图避免调用新的。我很乐意用稍微复杂的代码换取更少的内存泄漏。
原文由 Jamison Dance 发布,翻译遵循 CC BY-SA 4.0 许可协议
C++ 中的 const 正确性仍然让我头疼。在处理一些旧的 C 代码时,我发现自己需要将 C++ 字符串对象赋值为 C 字符串并将其分配给变量。但是,变量是 char *
并且 c_str()
返回一个 const char []
。有没有一种很好的方法来解决这个问题而不必滚动我自己的功能来做到这一点?
编辑: 我也试图避免调用新的。我很乐意用稍微复杂的代码换取更少的内存泄漏。
原文由 Jamison Dance 发布,翻译遵循 CC BY-SA 4.0 许可协议
C++17 及更新版本:
foo(s.data(), s.size());
C++11、C++14:
foo(&s[0], s.size());
_然而_,这需要注意: &s[0]
/ s.data()
/ s.c_str()
的结果只保证在调用任何可能改变细绳。因此 ,您不应将这些操作的结果存储在 任何地方。最安全的是在完整表达式的末尾使用它们,就像我的例子一样。
前 C++-11 答案:
由于对我来说莫名其妙的原因没有人像我现在这样回答这个问题,而且由于其他问题现在已经结束指向这个问题,我会在这里添加这个,即使来得太晚一年将意味着它挂在最堆的底部……
使用 C++03, std::string
不能保证将其字符存储在连续的内存中,并且 c_str()
的结果不需要指向字符串的内部缓冲区,所以保证工作的唯一方法是:
std::vector<char> buffer(s.begin(), s.end());
foo(&buffer[0], buffer.size());
s.assign(buffer.begin(), buffer.end());
这在 C++11 中不再适用。
原文由 sbi 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答2.7k 阅读✓ 已解决
我想总是有
strcpy
。或者在 C++ 代码中必须与旧代码交互的部分使用
char*
字符串。或者重构现有代码以使用 C++ 编译器进行编译,然后使用
std:string
。