使用带有str.erase()的索引擦除字符串的元素?

时间:2018-03-29 20:10:44

标签: c++ c++11

如何使用erase()方法删除部分std::string" str"以str.erase(str[i])

的形式

当我运行下面的代码时,它只输出字符串减去第一个元素,然后输出一些奇怪的字符。

#include<bits/stdc++.h>
using namespace std; 
int main()
{
    string s;
    cout << "Please input the desired string : \n";
    cin >> s;
    int sz = sizeof s;
    int x = sz / 2;
    if ((sizeof s)%2 != 0)
    {
        s.erase(s[x]);
    }
    else
    {
        s.erase(s[x-1], s[x]);
    }
    for (int j=1; j <= sz; j++)
    {
        cout << s[j];
    }    
}

1 个答案:

答案 0 :(得分:0)

std::string::erase()方法有几个重载:

basic_string& erase( size_type index = 0, size_type count = npos );
iterator erase( iterator position );
iterator erase( const_iterator position );
iterator erase( iterator first, iterator last );
iterator erase( const_iterator first, const_iterator last );

s.erase(s[x])调用第一次重载,将s[x]视为index(因为char可以隐式转换为std::string::size_type)。

首先,s[x]不是有效索引(仅x),因此未定义行为

其次,您未明确指定count参数的值,因此使用默认值npos,告知erase()删除所有包括指定的index之后的字符,这可能不是您想要的(或者是它?您是否只想删除{{1}处的charindex之后的所有 char,或 {/ p>}。

index也会调用第一个重载(隐式将2 s.erase(s[x-1], s[x])转换为char)。同样,您传入的size_type不是有效的索引或计数,因此这也是未定义的行为

您的代码中还存在其他问题。

char返回sizeof s的字节大小(即s类本身的大小),而不是std::string包含的字符数据的长度。这些字符存储在内存中的其他位置(除非您输入一个小字符串,并且您的STL的s实现使用Small String Optimization)。使用std::strings.length()获取字符数据的长度。

您看到意外的输出,因为s.size()索引是从0开始的,而不是从1开始的。您的std::string循环会跳过for中的第一个字符,并越过s的末尾进入周围的记忆,这也是未定义的行为。更重要的是,当您致电s时,您正在修改s的长度,但是您没有更新s.erase()变量以反映新的长度,因此您的sz可能会循环播放超越for的结束。

话虽如此,请尝试更像这样的事情:

s