指针妙用(话不多说,上题)
输入一行原文本(可以包含中文、英文、标点符号),再输入待修改的子串以及修改后的子串(不包含空串或空白字符),对这行原文本执行查找和替换操作,输出查找到子串的次数,将查找到的子串全部替换成为修改后的子串,输出替换后的文本。
看似一道寻常的字符串替换,若是没有指针怕是要动点脑筋。
指针做法
#include<stdio.h>
#include<string.h>
void solve(char *a, char *b, char *c){
char *p;
while((p=strstr(a,b))!=NULL){
int len=p-a;
int len1=strlen(a),len2=strlen(b),len3=strlen(c);
char temp[10005];
strcpy(temp,a+len+len2);
for(int i=0; i<len3; i++)a[len+i]=c[i];
strcpy(a+len+len3,temp);
}
}
int main(){
char a[10005],b[205],c[205];
while(gets(a)){
scanf("%s%s",b,c);
getchar();
solve(a,b,c);
printf("%s\n",a);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
}
return 0;
}
非指针做法
#include<stdio.h>
#include<string.h>
#define N 10050
void replace(char s[], char x[], char y[]){
char r[1000]={'\0'};
int m,a,b=0,k=strlen(s),p=0,c=strlen(x),o=strlen(y);
s[k]=' ';s[k+1]='\0';
for(m=0;s[m]!='\0';m++,b=0){
a=m;
while(s[a]==x[b]){ //寻找是否有相同的地方//
a++;b++;
}
if(b==c){
strcat(r,y); //将要替换的字符串至于r末尾//
p+=o; //r跨越一个要替换字符串的长度//
m=m+c-1; //原字符串跨越一个目标字符串的长度继续寻找//
}
else{
r[p++]=s[m]; //将目标字符串之前的字符存放于r中//
}
}
strcpy(s,r);
}
int main(){
char s[3*N+1], x[N+1], y[N+1];
while(gets(s)){
scanf("%s%s",x,y);
getchar();
replace(s,x,y);
printf("%s\n",s);
}
return 0;
}