C++ Primer 习题9.35给出的答案如下:
#include<iostream>
#include<cctype>
#include<string>
using namespace std;
int main()
{string str = "This IS A Example";
for(string::iterator iter = str.begin();
iter != str.end();++iter){
if(isupper(*iter)){
str.erase(iter);
--iter;
}
}
for(string::iterator iter = str.begin();
iter != str.end();++iter)
cout<<*iter<<" ";
return 0;
}
以上运行报错。
解:
由于第一个字母为T,--iter后
--iter--ite,,r则超出迭代范围了。
改成string str = "this is A exaMple";
如下,则可通过
#include<iostream>
#include<cctype>
#include<string>
using namespace std;
int main()
{
string str = "this is A exaMple";
for(string::iterator iter = str.begin();
iter != str.end();++iter){
if(isupper(*iter)){
str.erase(iter);
--iter;
}
}
for(string::iterator iter = str.begin();
iter != str.end();++iter)
cout<<*iter<<" ";
return 0;
}
本文通过一个具体的C++ Primer习题解答过程,详细分析了一段删除字符串中大写字母代码的问题所在,并给出了正确的解决方案。文章指出,当字符串的第一个字符即为大写时,迭代器减操作会导致其超出有效范围,进而引发错误。





