前言
正文
思路
详见代码注释,有关find()和replace()函数,也贴在代码下面,这两个函数以及和substr()在解字符串类型的题时,作用非常大。比如通过find()和substr()函数,我们就可以自己实现split()函数用于分割字符串,详见——>PAT B1009 说反话
参考题解
#include<iostream>
#include<string>
using namespace std;
/*
用一个二维字符串数组str存储输入的值,一个bool数组flag来表示对应的密码是否
被修改过 ,遍历密码字符串,将其中的'1'替换为'@','0'替换为'%',l替换为'L'
而'O'替换为o。若该字符串中有上述字符,则对应的flag设为true;这里需要
注意用变量定义数组长度的时候不能同时对数组进行初始化,需要在定义之后再初始化
*/
int main(){
int n,count=0;//count表示需要修改的数量
cin>>n;
//注意用变量定义数组长度的时候不能同时对数组进行初始化,需要在定义之后再初始化
bool flag[n];
for(int i=0;i<n;i++){
flag[i]=false;
}
string str[n][2];
for(int i=0;i<n;i++){
for(int j=0;j<2;j++){//读入字符串
cin>>str[i][j];
}
while(str[i][1].find("1")!=string::npos){//循环查找是否有"1"
str[i][1]=str[i][1].replace(str[i][1].find("1"),1,"@");
flag[i]=true;
}
while(str[i][1].find("0")!=string::npos){
str[i][1]=str[i][1].replace(str[i][1].find("0"),1,"%");
flag[i]=true;
}
while(str[i][1].find("l")!=string::npos){
str[i][1]=str[i][1].replace(str[i][1].find("l"),1,"L");
flag[i]=true;
}
while(str[i][1].find("O")!=string::npos){
str[i][1]=str[i][1].replace(str[i][1].find("O"),1,"o");
flag[i]=true;
}
}
for(int i=0;i<n;i++){//计算需要修改的密码数量
if(flag[i])count++;
}
if(count==0){//没有需要修改的密码
if(n==1)cout<<"There is 1 account and no account is modified"<<endl;
else cout<<"There are "<<n<<" accounts and no account is modified"<<endl;
}else{//有需要修改的密码
cout<<count<<endl;
for(int i=0;i<n;i++){
if(flag[i]==true)cout<<str[i][0]<<" "<<str[i][1]<<endl;
}
}
return 0;
}
string& replace (size_t pos, size_t len, const string& str)
用str 替换指定字符串从起始位置pos开始长度为len 的字符
EG:
#include<iostream>
using namespace std;
int main(){
string line="hello world, i love C++!";
string s = line.replace(line.find("i"), 1, "haha");
cout<<s<<endl;
return 0;
}