如何使用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];
}
}
答案 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}处的char
在index
之后的所有 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::string
或s.length()
获取字符数据的长度。
您看到意外的输出,因为s.size()
索引是从0开始的,而不是从1开始的。您的std::string
循环会跳过for
中的第一个字符,并越过s
的末尾进入周围的记忆,这也是未定义的行为。更重要的是,当您致电s
时,您正在修改s
的长度,但是您没有更新s.erase()
变量以反映新的长度,因此您的sz
可能会循环播放超越for
的结束。
话虽如此,请尝试更像这样的事情:
s