字符串题目,代码里面用了一点vector的东西,主要使用string类,以前没怎么用过,总结一下用到的string类的几个成员函数:
string::find(string str, int start_pos)
在字符串里面找第一个出现子串str的位置,位置从0开始,如果找不到子串,返回string::npos
string::erase(int start_pos, int num)
擦除掉start_pos开始的num个字符
string::replace(int start_pos, int len, string str)
将字符串从start_pos开始的len个字符替换为字符串str
string::find(string str, int start_pos)
在字符串里面找第一个出现子串str的位置,位置从0开始,如果找不到子串,返回string::npos
string::erase(int start_pos, int num)
擦除掉start_pos开始的num个字符
string::replace(int start_pos, int len, string str)
将字符串从start_pos开始的len个字符替换为字符串str
综合应用上面的三个函数,这道题就好解决了。
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
#define TEXT_LEN 300
struct node
{
string str1;
string str2;
};
vector<struct node> m;
void change(string &s, string str1, string str2)
{
//cout << "change \"" << str1 << "\"to \"" << str2 << "\"" << endl;
int pos;
pos = 0;
while(1)
{
pos = s.find(str1, pos);
if(pos == string::npos)
break;
if(str2.length() > 0)
{
s.replace(pos, str1.length(), str2);
pos ++;
}
else
{
s.erase(pos, 1);
}
if(pos >= s.length())
pos = 0;
}
}
int main(void)
{
string s1, s2, s;
s.resize(TEXT_LEN);
char buffer[TEXT_LEN];
int n, i;
vector<struct node>::iterator it;
struct node word_pair;
while(1)
{
gets(buffer);
sscanf(buffer, "%d", &n);
if(!n)
break;
m.clear();
for(i=1; i<=n; i++)
{
gets(buffer);
word_pair.str1.assign(buffer);
gets(buffer);
word_pair.str2.assign(buffer);
m.push_back(word_pair);
}
gets(buffer);
s.assign(buffer);
for(it=m.begin(); it!=m.end(); it++)
{
change(s, it->str1, it->str2);
}
cout << s << endl;
}
return 0;
}