这个问题主要考验的是逻辑思维: 以下均假设我们要将A字符串中的B字符串删除
首先,我们要知道:当我们在A字符串中检测到B字符串的开头字母时,我们就要停靠在该位置。
此时我们需要检测这个位置后的与B字符串相同长度的一段字符串是否与B相同,此时我们就要进行循环B的长度次来判断。而且我们不能改变这个位置,所以我们需要重新定义一个变量来遍历往后的位置。当不满足是B字符串这个条件时,我们就继续往后偏移一位开始查找偏移一位是为了防止类似于下图的情况
当我们发现这个位置后面的字符串于B完全相同时,我们此时需要将A字符串这个位置往后B字符串长度的字符串移到这里来,达到删除的效果,此时我们需要将这个位置保留,继续从这里检测。此时是为了防止以下情况
我们来看代码部分:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 1024
#define F 32
void del(char *arr,char *b);
int main(int argc, char *argv[])
{
char arr[N]={0};
char arr1[F]={0};
printf("请输入一个字符串arr1: ");
gets(arr);
printf("请输入要删除的字符:");
gets(arr1);
del(arr,arr1);
puts(arr);
return 0;
}
void del(char *arr,const char *b) //传地址是为了直接改变arr的内容
{
int n = strlen(arr); //求出两段字符串长度
int m= strlen(b);
char *p = arr; //定义一个char *的指针指向A数组的开头
int q=0; //用来遍历arr字符串的变量 ,表示arr判断到的位置
while(*p) //循环完arr数组
{
int j = 0; //当找到起点时,用j来遍历b字符串
if(*(arr+q) == *b) //找到起点
{
while(*(arr+q+j)==*(b+j)) //一直判断他们是否相等
{
j++;
if(*(b+j) == '\0') //判断每次进来的b的后一位是否是NULL
{
int k = 0; //当存在b数组时将arr该起点q往后m长度的字符串开始往前移
while(*((arr+k)+q)=*(arr+m+q+k))
{
k++;
}
p--; //继续判断该位置是否相等
q--; //继续判断该位置是否为空(防止越界)
break; //跳出循环,避免出现偏移后arr后面只有一个字符,
} //往后偏移后为NULL,使上一个while()判断相等
}
}
q++; //判断是否相等的位置往后偏移
p++; //判断是否为NULL的位置往后偏移
}
return ;
}
改代码是初学时的代码,具有很多缺点以及可以改善的地方,但逻辑是并没有问题的。这是反复验证的效果,很多注释都是确实面临了这样的问题才得到的。