# include <iostream># include <string># include <cctype>using namespace std;int main(){string s("This is A example");for(string::iterator iter = s.begin(); iter != s.end(); ++iter)if(isupper(*iter)){iter = s.erase(iter);--iter;}return 0;}在Visual Studio 11.0 中运行上述程序目标是 删除string字符串中的大写字母
2 回答
胡子哥哥
TA贡献1825条经验 获得超6个赞
if(isupper(*iter)){
iter = s.erase(iter);
--iter;
}
问题在这里 iter = s.erase(iter);
注意std::string 实际上里面是个动态 char[]
迭代器内部的内容实际是个char*
那么当erase后 数组长度发生变化
根据动态数组的概念 是不是会发生
char* new_p = new char[new_length];
memcpy(new_p, old_p, new_length);
那么原来的指针还能用吗??
所以你这个功能应该使用 std::remove_if
同样的 vector也不能使用这样的操作
但是类似操作 list就可以。
鸿蒙传说
TA贡献1865条经验 获得超7个赞
试试这个
# include <iostream>
# include <string>
# include <cctype>
using namespace std;
int main()
{
string s("This is A example");
for(string::iterator iter = s.begin(); iter != s.end();)
if(isupper(*iter))
iter = s.erase(iter);
else
++iter;
cout<<s<<endl;
return 0;
}
- 2 回答
- 0 关注
- 139 浏览
添加回答
举报
0/150
提交
取消