您的位置:首页 > 其它

UVa 10115 - Automatic Editing解题报告

2014-01-28 19:00 393 查看
一道字符串匹配处理题目。

核心是字符串的提取和拼接。如果用c++的string,这道题很容易解决,也可以用c的字符串处理函数做,个人觉得c的语法更接近编程语言的底层,因为要深入到每个字符的操作,而c++的string让字符串的处理变得简单,这提供了方便,但是个人觉得像我这样的初学者最好不要用封装的string,这样失去了深入了解编程语言的机会。

现在我也可以理解为什么在网上看到一些人建议初学者不要用STL做题,因为用着别人准备好的东西做题,实际上你并没有深入理解程序运行的过程。

我自己写的代码,结果考虑欠妥,没有对替换后的string再次检查替换同一个find。上网查了一下,发现别人写的代码比较简洁。所以附上两个版本的代码。

首先是我自己写的

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

char Find[25][100], replace[25][100];
char str[300];
char S[300], L[300], F[300];//S表示提取的单词,L表示str中S的前面的字符串,L表示后面的
void F_rest(int);//提取F
void L_rest(int);//提取L
bool change(int);//替换str中的find

int main()
{
//freopen("data.txt", "r", stdin);
int num;
while (scanf("%d", &num))
{
if(!num)
break;
getchar();//用cin.getline之前需要把前面的换行符读取掉
for(int i = 0; i < num; i++)
{
cin.getline(Find[i], 100);
cin.getline(replace[i], 100);
}
cin.getline(str, 300);
for(int i = 0; i < num; i++)//测试num个
while(change(i))//每次替换后要记得对新的str再次测试一次
change(i);
printf("%s\n", str);
memset(str, 0, 300);
}
}

void F_rest(int a)
{
memset(F, 0, 300);
for(int i = 0; i < a; i++)
F[i] = str[i];
}

void L_rest(int b)
{
memset(L, 0, 300);
int j = 0;
for(int i = b; i < strlen(str); i++)
L[i - b] = str[b + j++];
}

bool change(int i)
{
for(int j = 0; strlen(str) - j >= strlen(Find[i]); j++)//确保不越界
{
int m = 0, k;
for(k = j; k < strlen(Find[i]) + j; k++)//提取与find相同长度的字符串
S[m++] = str[k];
if(strcmp(S, Find[i]) == 0)
{
F_rest(j);//
L_rest(k);//
memset(str, 0, sizeof(str));
strcat(str, F);//拼接提取的字符串
strcat(str, replace[i]);
strcat(str, L);
memset(S, 0, sizeof(S));
return true;
}
}
memset(S, 0, sizeof(S));
return false;
}


接下来是另一个比较简洁的版本,通过使用strstr()函数和sprintf函数

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

char Find[25][100], replace[25][100];
char str[300];
char L[300];
bool change(int);//替换str中的find

int main()
{
freopen("data.txt", "r", stdin);
int num;
while (scanf("%d", &num))
{
if(!num)
break;
getchar();//用cin.getline之前需要把前面的换行符读取掉
for(int i = 0; i < num; i++)
{
cin.getline(Find[i], 100);
cin.getline(replace[i], 100);
}
cin.getline(str, 300);
for(int i = 0; i < num; i++)//测试num个
while(change(i))//每次替换后要记得对新的str再次测试一次
change(i);
printf("%s\n", str);
memset(str, 0, 300);
}
}

bool change(int i)
{
char * pstr = NULL;
pstr = strstr(str, Find[i]);//找到要替换的字符串出现的地方
if(pstr == NULL)
return false;
sprintf(L, "%s", pstr + strlen(Find[i]));//将要替换部分后边的字符串暂存到L数组里
sprintf(pstr, "%s", replace[i]);//将要替换的部分进行替换(将要替换后边的字符串也覆盖掉了)
sprintf(pstr + strlen(replace[i]), "%s", L);//将暂存的字符串补上
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: