今天来写一个字符串问题的算法,也是巩固下知识,挺有趣的一个方法。也算是一种思想!
这个问题就是让一个字符串指定位置插入在另一个字符串中
办法就是先让被插入字符串指定位置后的字符串插入到插入字符串中,然后再让插入字符字符串全部插入被插入字符串指定位置后
eq: 字符串"abcdef"插入在字符串"ghijkl"第三个位置后
step1:字符串"ghijkl"第三个位置后的字符,插入到字符串"abcdef"后
resultant1:"abcdefjkl"
step2 : 字符串"abcdefjkl"插入到字符串"ghijkl"第三个位置后
resultant2:"ghiabcdefjkl"
这样就可以啦!这个方法很妙,全程在运用指针。
方法: 先给出代码再用图来解释代码
int main()
{
char s[30] = "study";
char t[30] = "i like ";
insert(s, t, 0);
puts(s);
}
void insert(char* ps, char* pt, int pos)
{//t插入在s的pos位置
char* p = pos + ps; //p指向插入位置
char* q = pt; //q指向t
while (*q != '\0') //q指向t的‘\0’
{
q++;
}
while (*p != '\0')
{
*(q++) = *(p++); //s插入位置后的值赋值给t‘\0’的值
}
p = pos + ps; //p重新指向插入位置
while (*pt != '\0')
{
*(p++) = *(pt++); //t的值赋值给s插入位置后
}
}
初始状态:
因为pos为0,所以p指针和ps指针指的地方一样,因为q指针就是指向pt指针指向的位置,所以图为:
然后就是q指针在动,就是不等于'\0'时就往'\0'那边走,直到最后等于'\0'就停止了
*(q++) = *(p++)这句语句可以写成:*(q) = *(p);
p++; q++;
*号为解引用操作,可以理解为p,q为地址,*q则为值,所以*(q) = *(p)其实就是赋值操作,while和上一条是一样的意思,所以结果为:
p = pos + ps;这条语句就是说,让p回到插入位置,给我滚回来!结果就是:
然后最后一步就是把t里的字符串全部插入到s的插入位置上啦。
插是插在插入位置,所以让p回去的好处就是这个,一般情况下,我们是不动首地址的指针的,都是复制一份过来,这和单链表的原理一样,大家有兴趣可以去学学,插入后结果就如下图!
指针比较灵活也容易用错,比如动态分配的问题,时常会发生让你意想不到的问题,会大量的浪费你的时间,计算机这东西你会了你可能就会了,你不会,那真就是猜不出来了,还是需要大量的知识储备再加上无数次的实操,加油吧!