UVa 10115 - Automatic Editing解题报告
2014-01-28 19:00
393 查看
一道字符串匹配处理题目。
核心是字符串的提取和拼接。如果用c++的string,这道题很容易解决,也可以用c的字符串处理函数做,个人觉得c的语法更接近编程语言的底层,因为要深入到每个字符的操作,而c++的string让字符串的处理变得简单,这提供了方便,但是个人觉得像我这样的初学者最好不要用封装的string,这样失去了深入了解编程语言的机会。
现在我也可以理解为什么在网上看到一些人建议初学者不要用STL做题,因为用着别人准备好的东西做题,实际上你并没有深入理解程序运行的过程。
我自己写的代码,结果考虑欠妥,没有对替换后的string再次检查替换同一个find。上网查了一下,发现别人写的代码比较简洁。所以附上两个版本的代码。
首先是我自己写的
接下来是另一个比较简洁的版本,通过使用strstr()函数和sprintf函数
核心是字符串的提取和拼接。如果用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);//将暂存的字符串补上 }
相关文章推荐
- UVA 10115 自动编辑
- uva 10115 automatic editing
- UVA10115
- uva10115--String
- UVa:10115 - Automatic Editing
- UVa-10115-Automatic Editing
- UVA 10115 - Automatic Editing(字符串替换问题)
- UVa 10115 - Automatic Editing
- UVa - 10115 - Automatic Editing
- UVa-10115-Automatic Editing
- UVA 10115
- uva 10115 Automatic Editing
- UVA10115 - Automatic Editing
- UVA 10115 Automatic Editing
- UVA-10115 Automatic Editing
- UVA 10115
- uva10115
- uva 10115(字符串)
- UVA - 10115 Automatic Editing
- uva - 10115 - Automatic Editing