为了加深自己的印象,又又来更新了。
上集回顾:求串长,判空串,串赋值,串比较http://t.csdnimg.cn/qzEDJ
这次主要写的是串连接,串插入和串删除三个部分。
(一)串连接
int strcat(str a, str s1,str s2){
a.len=0;//清空a
if(a.ch==NULL) return 0;
int i=0,j=0;
//先把s1存入a
while(i<s1.len-1){//不读最后一个字符
a.ch[i]=s1.ch[i];
i++;
}
while(j<s2.len){
a.ch[i+j]=s2.ch[j];
j++;
}
a.len=s1.len+s2.len;
printf("连接后的串为:");
for(int i=0; i<a.len; i++){
printf("%c",a.ch[i]);
}
printf("\n\n");
return 1;
}
主要的思路就是:先把新串(就是存储串a和串b连接后的新串)的长度先定义为0,也可以理解成清空串。然后就是分别来读入两个串,先读入串s1,依次先放入新串a,然后再读入串s2,存入串a,最后记得修改新串a的长度,以便于输出。最后输入两个换行可以省略,纯粹是为了完整代码在运行时自己能够一目了然看出我的代码运行到哪一步。
(二)串插入
主要思路:读入的数据为 目标串,插入位置,插入的串
所以需要这么定义:
int strInsert(str *s,int pos,str t)
定义后就是对插入函数进行自定义编写,思路如下:
①先判断传入的pos位置是否合法
②在串合法的情况下,首先我们应该知道插入一个数,后面的数全部要往后移?那么这个时候存在两个疑问,一个需要几个字符向后移,还有一个问题就是我需要向后移几位?
第一个问题就是,我们要在原字符长度上扣除在插入位置前的剩余的字符,就是我需要移动的字符个数。
第二个问题,需要向后移几位,是由插入字符的长度决定的。例如,我插入的串长度为6,但是这里需要注意,串“123”的长度是4,所以在计算时我们需要根据实际情况进行减1;
做个举例,我要在目标串“12346”下标为3的位置前插入串“808”,最终的结果应该是“12380846”,就这个例子来说,字符46需要向后移动3位(串808的长度再-1),这个还是需要稍微理解一下(因为我自己最开始的时候也绕进去了)
具体代码如下:
两部分实现,插入位置前的字符可以保持不动,但是插入位置后的我需要先将字符往后移,然后进行插入,如果我先插入后移动,原有的数据就覆盖掉了。这个可以在测试运行的时候发现问题。
int i;
if( pos<0 || pos > s->len) return 0;//输入位置不合法
int h=s->len-pos-1;
int g;
g=s->len-2;
for(i=1;i<=h;i++) {
s->ch[g+t.len-1]=s->ch[g];
g--;
}
for(i=0;i<t.len-1;i++){//填入替换部分
s->ch[pos+i]=t.ch[i];
}
return 1;
最后,解释一下串插入部分的一个小点,就是参数的传递是单向传递的,在函数内部改变形参的值不会修改实参的值,所以使用了指针传递。
最后,解释一下串插入部分的一个小点,就是参数的传递是单向传递的,在函数内部改变形参的值不会修改实参的值,所以使用了指针传递。
(三)串删除
如果理解了上面的串插入,串删除应该也是很好理解的了。
串删除就是把下标位置起,长度为l的字符用新的字符覆盖掉,当然传入的下标位置和长度需要合法,不然肯定是报错的。
代码如下:
int StrDelete(str *s, int pos, int len){/*在串s中删除从下标pos起len个字符*/
int i;
if (pos<0 || pos>(s->len-len))/*删除参数不合法*/
return(0);
for (i=pos+len;i<s->len;i++)
s->ch[i-len]=s->ch[i]; /*从pos+len开始至串尾依次向前移动,实现删除len个字符*/
s->len=s->len - len; /*s串长减len*/
return 1;
}
下集预告:取子串,和从第i个位置取长度为l的串。