为了账号安全,请及时绑定邮箱和手机立即绑定

它错在哪里? 会提示如下错误:

它错在哪里? 会提示如下错误:

C++
狐的传说 2023-04-22 18:14:15
# 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就可以。

查看完整回答
反对 回复 2023-04-25
?
鸿蒙传说

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;

}

查看完整回答
反对 回复 2023-04-25
  • 2 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信