看看下面的代码 我想知道
kk=kk+hh+ll;kk是字符串指针,hh ll 为整数 我多次实验下来是删除操作
我想知道这个操作的原理是什么?
我认为会影响到a 的数据,但实际输出后并没有影响a这个二维字符串的数据
//char a[N][80] 已经存在 int k也存在
char Y[80];
cout<<"\n输入要删除的字符串:";cin.getline(Y,80);
for(int i=0;i<k;i++){
char *kk=a[i];
while(BF(kk,Y)>-1){ //BF是查找字符串返回该位置
int hh=BF(kk,Y);
int ll=strlen(Y);int j=hh;
for(;kk[j+ll]!='\0';j++){
kk[j]=kk[j+ll];
}
kk[j]='\0';
kk=kk+hh+ll; //删除操作
}
}
哈哈,看到有人批评你命名了。罗嗦几句,写的代码要给别人读确实要好好起名,此外要问别人问题就把问题说清楚,比如你的BF函数,贴上来让大家知道具体是干嘛的。你说BF是查找字符串返回该位置,到底是找 Y 是 a[N][80] 中第几行的意思,还是找 Y 在某一行第几列的意思,所以BF贴上来或是说清楚,你说是吧?
接下来解答你的疑问,这建立在我猜测 BF找的是Y在 a[N][80] 中第几行的基础上。
删除操作不是你理解的 kk=kk+hh+ll;这一句,而是 for 循环实现了删除。我们捋一捋哈。
1. kk是指针,指向 a[N][80]的首行
2. hh是整数,代表Y在a中的第几行。
3. ll是常数80.
那么for循环实现的就是
int j=hh; //获取Y在的行数,从此行开始
for(;kk[j+ll]!='\0';j++){ //循环直至a中没有内容为止
kk[j]=kk[j+ll]; //将此行替代为下一行的内容
}
kk[j]='\0'; //将原来最后一行设置为'\0',就是删掉原来最后一行
所以你说的
kk=kk+hh+ll;
这一句,并没有删除的功能,只是将kk这个指针,指向了被删除行的下一行而已。
这么说你明白了吧
首先你这命名规范和编码风格着实让我感动。其次,我个人觉得删除字符串的代码在for循环中 kk[j]=kk[j+ll]; 将后面的字符串往前赋值覆盖达到删除效果。至于 kk=kk+hh+ll; //删除操作,你又将a数组的首地址指向了删除字符串后的首地址,不知道你是何用意。我个人理解是这样的。