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:请不要叫我去找题解,我有,但是我使用了另一种方法来解决这个问题。

谢谢大家!

...全文
75 点赞 收藏 6
写回复
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因该保持不变
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告