复制 std::string::insert(int pos, char ch)

Posted

技术标签:

【中文标题】复制 std::string::insert(int pos, char ch)【英文标题】:Replicating std::string::insert(int pos, char ch) 【发布时间】:2017-10-20 22:48:41 【问题描述】:

我正在尝试复制 std::string::insert 方法。 这是我的代码。

string& string::insert(int pos, char ch)

    int len = m_length; //the length of the current string
    resize(++m_length); //a method to resize the current string(char *) 
    char *p = m_data + pos; //a pointer to the string's insert position 
    for (int i = len-1; i >= 0; i--)  //shift characters to the right
        p[i+1] = p[i];
    
    *p = ch; //assign the character to the insert position
    m_data[m_length] = '\0'; //finish the string
    return *this;

但是,使用该代码时,我的应用有时会在将字符向右移动时崩溃。

谁能指出可能是什么问题以及如何解决它?

非常感谢您!

【问题讨论】:

创建minimal reproducible example 如果这是你的实际代码,你的调整大小应该是resize(m_length +1),否则你实际上将 m_length 增加了 1,这将导致 m_data[m_length] = '\0'; 除了导致其他问题之外。虽然我需要看到resize 才能确定... @Zack Lee This loop for (int i = len-1; i >= 0; i--) //向右移动字符 p[i+1] = p[i] ; 没有意义。您必须从该位置开始移动元素。那就是表达式 p + len 可以在字符串之外。 【参考方案1】:

你移动了太多的字符。您只需要移动len - pos 个字符,而不是len 个字符。

而且如果初始化i的时候不减1,循环会移位已有的空字节,所以最后不需要单独加。

string& string::insert(int pos, char ch)

    int len = m_length; //the length of the current string
    resize(++m_length); //a method to resize the current string(char *) 
    char *p = m_data + pos; //a pointer to the string's insert position 
    for (int i = len - pos; i >= 0; i--)  //shift characters to the right
        p[i+1] = p[i];
    
    *p = ch; //assign the character to the insert position
    return *this;

【讨论】:

这完美解决了问题。非常感谢@Barmar

以上是关于复制 std::string::insert(int pos, char ch)的主要内容,如果未能解决你的问题,请参考以下文章

C#中'in'关键字的用途是啥? [复制]

如何保留 $in 查询的游标顺序? [复制]

如何保留 $in 查询的游标顺序? [复制]

为啥不建议数组使用 JavaScript 的 For...In 循环? [复制]

使用 JDBC 参数化 IN 子句的最佳方法是啥? [复制]

对 MongoDB $in 查询的响应顺序? [复制]