c语言作业
问题:编写一个函数,实现在一个字符串中能够寻找其他字符串并返回出现的位置。
分析:假设a字符串,在a字符串中寻找b字符串。分为以下几种情况:
char a[]="abcdefg"
char b[]="cde"
char a[]="abcdefg"
char b[]="deg"
char a[]="abcccdefg"
char b[]="cde"
char a[]="abcdefg"
char b[]="degsdejfr"
Anyway,我们都要遍历a的每一个元素,对于每一个元素,将其与b的是首元素对比,如果相同就继续下一个元素的比对,比对的过程中就会出现以上的各种情况:1.连续地找到b的全部元素(查找成功);2.在查找时出现了断裂,(第二个例子在f处断裂),这时,就要从a的刚才与b首元素对上号(d)的下一个元素(e)处重新查找b。3.如果情况二在查找失败后没有从原来的元素后面顺次查找,这种情况就会出现错误。4.在遍历了a中每个元素后,都没有找到完整的b,这时就不再查找,退出。
实现思路:
查找的过程运用指针,通过指针的移动,遍历数组元素,指针的移动并不会改变所指向的数组。在a中找b,那么结束有两种可能:找到了,返回位置;没找到,返回零。没找到结束的标志自然是指向a的最后一个元素‘\0’。两个数组中的元素进行对比,就要定义两个指针变量,如果找到了还要返回b在a中的位置,而指针的值是地址,要想返回数组的索引,就要利用数组存储的连续性,对两个地址做差,这两个地址是什么呢?首先减数肯定是数组a的首地址,被减数是b字符段首元素在a中的地址,在a中找到b的首元素后需要记录下这个地址,这么做有两个用途:一是如果后面的元素符合b的剩余元素,意味着查找成功,就做上面所说的减法,返回位置。二是如果后面的元素出现了断点,那么就从记下的这个元素的下一个元素重新开始对比。当开启重新对比时,由于上一次对比的过程中对b的指针进行了移动,所以新一轮要对b的指针进行重置。所以指针str与指针temp的移动并不同步,注意赋值时不要写成带*号的,因为那样操作是递引用,实际操作的是数组,而数组已被定义为const,不可修改,也不能修改。
int my_str(const char *str1,const char *str2)
{
const char *temp1=str1;
const char *temp2=str2;
const char *first=str1;
while(*str1)
{
while(*temp1==*temp2)
{
temp1++;
temp2++;
}
if(*temp2==0)
return str1-first;
temp2=str2;
str1++;
temp1=str1;
}
return 0;
}
个人理解,如有错误,希望批评指正,谢谢··