Description |
fjxmlhx每天都在被沼跃鱼刷屏,因此他急切的找到了你希望你写一个程序屏蔽所有句子中的沼跃鱼(“marshtomp”,不区分大小写)。 |
Input |
输入包括多行。每行是一个字符串,长度不超过200。 一行的末尾与下一行的开头没有关系。 |
Output |
输出包含多行,为输入按照描述中变换的结果。 |
Sample Input |
The Marshtomp has seen it all before. marshTomp is beaten by fjxmlhx! AmarshtompB |
Sample Output |
The fjxmlhx has seen it all before. fjxmlhx is beaten by fjxmlhx! AfjxmlhxB |
Hint |
不存在mar shto mp这种用空格分开的情况。 有可能一个句子中有两个以上“marshtomp”。 |
这道题看起来很简单,并且开始的时候做的也是挺简单的,但是这道题里所使用的库函数和这些库函数的使用方法却是好久都没用,还有关于字符串和字符数组的一些易错点,尘封了好久好久的知识点,开始在考试的时候做这道题的时候走了好多的弯路,先是对不分大小写有点错乱(其实把输入的字符串处理一下,用临时字符串记录变化为小写就好了,这样查找的是变成小写的临时字符串,处理的是输入的字符串);另外,开始的时候不会使用字符串的find()函数,用循环来完成匹配,这样代码就显得超乱,在第二个代码里优化了之后就好多了。
剩下的就很简单了。。。
#include <iostream> #include <cstdio> using namespace std; int main (){ char ch[300]; string tstr = "marshtomp" while(gets(ch)){ string str="",sstr=ch; int j=0; int len=sstr.length(); for(int i=0;i<len;i++) if(sstr[i]<='Z'&&sstr[i]>='A') str= str+(char)(sstr[i]-'A'+'a'); else str+=sstr[i]; int c=0; for(int i=0;i<len;i++,c++){ int temp=i; while(str[temp]==tstr[j]&&temp<len&&j<9){ temp++,j++; } if(j==9){ sstr.replace(c,9,"fjxmlhx"); i+=8,c+=6; } j=0; } cout<<sstr<<endl; } return 0; }
优化后的代码:
#include <iostream #include <cstdio> using namespace std; int main (){ char ch[300]; string tarstr = "marshtomp"; while(gets(ch)){//获取带空格的字符数组 string tempstr="",sstr=ch; int len=sstr.length(); for(int i=0;i<len;i++) if(sstr[i]<='Z'&&sstr[i]>='A') tempstr= tempstr+(char)(sstr[i]-'A'+'a'); else tempstr+=sstr[i]; //tempstr+='\0'; //str会在后面自动添加\0,否则长度会变长了,这里可以看出string不同于字符数组,字符数组的话需要加 //cout<<len<<' '<<tempstr.length()<<endl; int c=0; for(int i=0;i<len;i++,c++){ int xx=tempstr.find(tarstr,i);//找出字符串所在的位置 第一个参数为要查找的字符串,第二个为开始查找的起始位置 if(xx!=-1){ sstr.replace(xx,9,"fjxmlhx"); //第一个为要替换的起始位置,第二个为要替换的长度,第三个为被替换为的子串 i+=8,c+=6; } } cout<<sstr<<endl; } return 0; }这里总结一下这道简单题带给我的收获
从代码的顺序来:
gets() 获取带空格的字符数组
string+=的话就不用再加'\0'了
tempstr.find(tarstr,i); 找出字符串所在的位置 第一个参数为要查找的字符串,第二个为开始查找的起始位置
sstr.replace(xx,9,"fjxmlhx"); 第一个为要替换的起始位置,第二个为要替换的长度,第三个为被替换为的子串
好酸爽。。。