C++primer的一道习题6.15

whitelotus 2004-12-22 12:51:12
题目是:
写一个程序,已知下列字符串
"/.+(STL).*$1"
用erase(pos,count)去掉除了"STL"外的所有字符。

我写程序如下:
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
string t = "/.+(STL).*$1/";
string filt_elem = "./+)(*$1";

string::size_type pos = 0, begin_pos = 0;

cout << t <<endl;

while (pos = t.find_first_of(filt_elem,begin_pos)
!= string::npos)
{
cout << "After erase" << t[pos] << "is:" << endl;
t.erase(pos,1);
cout << t << endl;
//因为每次删除一个字符后,应该从前一个字符开始查找
begin_pos+=pos-1;
}

cout << "After while loop:" << t << endl;

return 0;
}

但是结果很奇怪:
下面是结果:
是一个死循环,而且除了第一个/外所有的字符都被删除了。
为什么?

Ps:请不要叫我去找题解,我有,但是我使用了另一种方法来解决这个问题。

谢谢大家!

...全文
106 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
whitelotus 2004-12-22
  • 打赏
  • 举报
回复
谢谢各位大虾,祝各位圣诞快乐,:)
以后还请你们多多帮忙!
liweiiewil 2004-12-22
  • 打赏
  • 举报
回复
这就是不写括号的坏处了,唉!!!
liweiiewil 2004-12-22
  • 打赏
  • 举报
回复
#include "string"
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
string t ("/.+(STL).*$1/");
string filt_elem ("./+)(*$1");
string::size_type pos = 0, begin_pos = 0;

cout << t <<endl;

while ((pos = t.find_first_of(filt_elem,begin_pos)) //注意这里的括号
!= string::npos)
{
cout << "After erase" << t[pos] << "is:" << endl;
t.erase(pos,1);
cout << t << endl;
//因为每次删除一个字符后,应该从前一个字符开始查找
// begin_pos+=pos-1;
}

cout << "After while loop:" << t << endl;

return 0;
}
xiaoqiang085 2004-12-22
  • 打赏
  • 举报
回复
当然是死循环啦!
循环条件中的优先级问题!
bnbn3 2004-12-22
  • 打赏
  • 举报
回复
哦,我看错了,因该是begin_pos=pos;才对
bnbn3 2004-12-22
  • 打赏
  • 举报
回复
去掉begin_pos+=pos-1,因为用了erase所以begin_pos因该保持不变

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧