C 字符串是可变的,不像 Java 字符串吗?

新手上路,请多包涵

以这种方式在 C++ 中操作字符串是否可以:

 string s = "Sting";
s[2] = 'a';

它工作正常(并打印“Sting”),但这样做安全吗?

如果是,这是否意味着它们是可变的?

原文由 abcde 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.4k
1 个回答

C++ 字符串文字,即 "literal" 是不可变的,尽管 C++03 允许将指向此类文字的指针分配给 char* (此权限已被 C++ 弃用并删除11)。尝试更改字符串文字的字符是未定义的行为:

 char* s = "literal"; // OK with C++03; illegal with C++11 and later
s[0] = 'x';          // undefined behavior

C++ std::string 对象当然是可变的,假设它们没有被声明为 std::string const 。如果您认为 char 对象的序列彼此独立,则可以分配给各个对象。然而,字符串实际上包含编码为 UTF-8 字节的 Unicode 是很常见的。如果是这种情况,更改字符串的任何元素都可能会破坏正确的编码,例如,因为连续字节被其他内容替换。

所以,是的,字符串是可变的,但从语义的角度来看,分配给单个元素可能并不安全。

原文由 Dietmar Kühl 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题