gpt4 book ai didi

c++ - 修改 C++ 字符串对象的底层 char 数组

转载 作者:可可西里 更新时间:2023-11-01 15:47:56 25 4
gpt4 key购买 nike

我的代码是这样的:

string s = "abc";
char* pc = const_cast<char*>( s.c_str() );
pc[ 1 ] = 'x';
cout << s << endl;

当我使用 GCC 编译上面的代码片段时,我得到了预期的结果 "axc"。我的问题是,以这种方式修改 C++ 字符串的底层 char 数组是否安全且可移植?或者可能有其他方法可以直接操作字符串的数据?

仅供引用,我的目的是编写一些可以被 C 和 C++ 调用的纯 C 函数,因此,它们只能接受 char* 作为参数。从 char* 到 string,我知道涉及复制,惩罚是不利的。那么,任何人都可以提出一些建议来处理这种情况。

最佳答案

对于第一部分,c_str() 返回 const char* 并且它意味着它所说的。在这种情况下,所有 const_cast 实现的是编译您的未定义行为。

对于第二部分,在 C++0x 中 std::string 保证具有连续存储,就像 C++03 中的 std::vector 一样。因此,只要字符串不为空,您就可以使用 &s[0] 获取 char* 以传递给您的函数。实际上,目前正在积极开发的所有 string 实现都已经有连续存储:在标准委员会 session 上进行了一次投票,没有人提供反例。因此,如果您愿意,现在就可以使用此功能。

但是std::string 使用与 C 风格字符串根本不同的字符串格式,即它是数据+长度而不是 nul 终止。如果您从 C 函数修改字符串数据,则您无法更改字符串的长度,并且如果没有 c_str(),您也无法确定末尾是否有空字节。并且 std::string 可以包含嵌入的 nul,它们是数据的一部分,所以即使您确实找到了 nul,在不知道长度的情况下您仍然不知道您已经找到了结尾字符串。在能够对两种不同类型的数据正确运行的函数中,您可以做的事情非常有限。

关于c++ - 修改 C++ 字符串对象的底层 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5729203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com