刚才一个网友帮我解决C语言编程的问题,但他写的编程有的地方看不懂,采纳了他的答案却没问他不懂的地方

这C语言的题是
【问题描述】从键盘输入一个字符串S和一个字符C,编程实现将字符串S中所有的C字符去除
【输入形式】一个字符串,一个字符
【输出形式】参见样例输出
【样例输入】a
Shanghai,I am coming!
【样例输出】Shnghi,I m coming!
希望懂C语言的朋友帮我看一下下面这个编程,//前面的是我不懂的,希望有人能给我解释一下,谢谢!
#include <stdio.h>
#include <string.h>
main()
{
char a[100];
char b[100];
int i,j,k;
int c=1;
gets(b);
gets(a);
for(i=0;i<strlen(a);i++)
{
c=1;
k=strlen(b);
for(j=0;j<k;j++)
{
if(a[i+j]!=b[j])c=0; //为什么这样写?
}
if(c==1)
{
for(j=0;j<=strlen(a);j++)
{
a[i+j]=a[i+j+k]; //也不懂为什么这样写
}
}
}
printf("%s\n",a);
}

请看我给你附加的图,假设a,b 两个字符串,a="1234567",b="45",如果要在a中除去b的话,首先要找到b在a中的位置,我标注A的地方就是找到b在a中的位置的

  找法:

     先循环a,看b在a的那个位置(或那些位置,一个个剔除),当第一次循环a时,i=0,获取b的长度为2,那么先将a 0 和b 0 进行不相等比较,如果不相等,则让c等于0,然后将a 1 和b1 位置相比(其实第一个位置比较失败了就不用在进行下去了),然后本次比较就完成了,开始执行B部分剔除,因为没有找到,c=0,所以不执行B部分;进行第二次大循环了,i=2,将a 1 和 b 0 相比,比较方式同第一次;

   当我们进行到第四次的时候,i=3,a 3 和 b 0相等,就不执行c=0了,然后j++,a 4 和 b1 相等了,也不执行c = 0,那么本次执行结束后c=1(因为b长度为2,执行两次循环),便要从a中去除b,因为外面的大循环i=3,那么在B部分a[i + J]就是a[3](也就是4),a[i +j+ k]就是a[5],将a[5]付给a[3],然后再次循环B部分,a[4]=a[6],就完成了在‘1234567’中去除‘45’了

这个程序是有些问题的,要注意了, B部分执行可能会报数组越界的,就和我上面一样如果a为“123456”,那么在执行a[4]=a[6]时,便越界了

不要怕循环,慢慢看,最好看时在旁边几下每次下标值和数组,便于分析的,

祝你成功

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-14
写代码的童鞋把功能给扩展了哦
lz的题目要求字符C,是从字符串S中是要删除字符C而已
写代码的童鞋,把功能扩展为
从字符串S中是要删除字符串C

虽然就结果看来,都是一样的,但是一下把难度提高了不少啊

if(a[i+j]!=b[j])c=0;
这句要结合之前的语句来看
k为要删除的字符串的长度,从a[i]开始到a[i+k-1]一个个和要删除的字符串中对应地字符比较,要是完全相同,变量c的值不会变,也就是之前赋给的1,否则为0

然后看下面的
a[i+j]=a[i+j+k];
这句也要结合之前的语句来看
之前说到了变量c,其实c的作用就是判断a[i]开始到a[i+k-1]的字符是不是完全和需字符串相同,相同的话c的值为1,否则为0
若c的值为1,也就是a[i]到a[i+k-1]就是要删除的部分,那么很简单了啦
就是把从a[i+k]到a[i+k+k-1]的值一次赋给a[i]到a[i+k-1]就好了
这部分不太好说,lz自己画图看看就可以了

其实不用这么复杂的一个个的比较,赋值,完全可以成块的比较赋值,这样lz可能会比较容易看懂

要我写的话,用库函数就好了么,干嘛那么麻烦
以下是我写的,也可以从字符串中 删除指定的字符串,但是怕lz不知道strncmp()这样的函数,所以就尽量使用了一般教材里使用的strcmp(),strcpy()这样的函数

#include <stdio.h>
#include <string.h>
main()
{
char a[100];
char b[100];
char t[100];//加入
int i=0,k;//修改
int flag;//c改名为flag,为了方便理解
gets(b);
gets(a);
k=strlen(b);
while(a[i]!='\0')
{
flag=0;
strcpy(t,&a[i]);
t[k]='\0';
if(strcmp(t,b)==0)
flag=1;
if(flag==1)
{
strcpy(t,&a[i+k]);
strcpy(&a[i],t);
}
else
i++;
}
printf("%s\n",a);
}本回答被提问者采纳
第2个回答  2011-10-14
问题是两个,那我也就解释那两个地方
首先第一个:程序在假定b是一个字符串,所以要取b字符串长度k的a字符串的成员和字符串b比较,b有k个成员就要比较k次,不等则c赋值为0,直到k次循环中c的为0或者是比较结束
第二个:c的值为1,说明从i起,a和b相同,那就从i起取b字符串长度k后的数据覆盖i+1
解释完毕
第3个回答  2011-10-14
这个程序写的好糟糕!!!
#include <stdio.h>
#include <string.h>
main()
{ char c='a';
int i=0,j=0;
char a[80]; // 存放待处理的字符串
char b[80]; // 存放处理完毕后的字符串
printf("请输入待处理字符串:");
gets(a);
printf("请输入想删除的字符:");
getchar(c);
while(i<strlen(a))
{
if(a[i]!=c) b[j++]=a[i];
i++;
}
b[j]='\0';
printf("处理完毕......\n");
puts(b);
}追问

非常非常感谢!

追答

能看懂不 , 代码清楚易懂就好

参考资料:刚写的

相似回答