我最近发现有必要std::string
用自身的子字符串替换的内容。我认为在这里调用的最合逻辑的函数是:http : //www.cplusplus.com/reference/string/string/assign/:
子字符串(2) 字符串和分配(const string&str,size_t subpos,size_t sublen);
复制从字符位置subpos开始并跨越sublen字符的str的部分(如果str太短或sublen是string :: npos,则跨越str的字符)。str
另一个字符串对象,其值将被复制或移动。subpos
str中第一个字符作为子字符串复制到对象中的位置。如果此长度大于str的长度,则抛出out_of_range。注意:str中的第一个字符由0表示(不是1)。sublen
要复制的子字符串的长度(如果字符串较短,则复制尽可能多的字符)。string :: npos的值表示直到str结束的所有字符。
但是,我不确定这是否允许,或者是否会破坏字符串数据。我知道memcpy()
,例如,不允许(或者至少不保证不发生损坏)用其自身的一部分覆盖内存区域(请参阅memcpy()vs memmove())。但是我不知道上面的方法是否有相同的限制。
更笼统地说,如果我本来能够自己弄清楚这个问题的答案,您能发表评论吗?我没有什么链接到该品牌的文档中就清楚地知道什么这个问题的答案是,除了可能的限定词“另一个”在的描述str
参数(“另一个字符串对象”),这似乎意味着它不能在此对象,虽然我不觉得这是毫不含糊的。这是文档中的弱点吗?
不。
此操作由[string :: assign] / 4定义:
basic_string& assign(const basic_string& str, size_type pos, size_type n = npos);
效果:确定
rlen
要分配为n
andstr.size() - pos
和call中较小者的字符串的有效长度assign(str.data() + pos rlen)
。
(错字)
然后:
basic_string& assign(const charT* s, size_type n);
效果:将所控制的字符串替换为
*this
一个长度字符串,该字符串的n
元素是所指向的元素的副本s
。
关于这是否str.assign(str, 0)
完全安全并没有任何说明(特别是,我们无法知道何时复制每个字符!)。
因此,我强烈建议您避免这样做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句