猿问

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

# 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字符串中的大写字母




狐的传说
浏览 140回答 2
2回答

胡子哥哥

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就可以。

鸿蒙传说

试试这个# 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;}
随时随地看视频慕课网APP
我要回答