# 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 關注
- 170 瀏覽
添加回答
舉報
0/150
提交
取消