我的代码哪里错了-_-||为什么总有一组数据输出错误?

编制具有如下原型的函数findLast:

   char*findLast(char*sourceStr,char*subStr);

findLast函数则要返回源串sourceStr中最后一次出现subStr子字符串的头字符位置。
而后编制主函数,输入两个字符串,将它们用作实参来调用这两个函数,如果返回NULL输出-1,否则输出子字符串出现时头字符在原字符串的下标,每个结果占一行。
要求实现程序中不可使用“string.h”头文件内有关寻找子串的标准库函数。

【输入形式】输入源串sourceStr,子字符串subStr。
【输出形式】子字符串subStr最后一次在源串sourceStr中出现的位置
【样例输入】
        welcometochinauniversityofminingandtechnology
        in
【样例输出】29
#include<iostream>
using namespace std;

char*findLast(char*,char*);
int main()
{   
    char*a;
    char sourcestr[100];
    char substr[10];
    cin.getline(sourcestr,100);
    cin.getline(substr,10);
    a=findLast(sourcestr,substr);
    if(a==NULL)
    cout<<-1;
    else
    cout<<a-sourcestr;
    return 0;
}
char*findLast(char*sourcestr,char*substr)
{
  int i=0,j=0,len1=0,len2=0,k=0,x=0;
  char*p1=sourcestr;
  char*p2=substr;


  while(sourcestr[i]!='\0')
  {
   len1++;
   i++;
  }


  i=0;
  while(substr[i]!='\0')
  {
   len2++;
   i++;
  }
  if(len1<len2)
  return NULL;
  else
 {
   for(i=0;i<len1;i++)
   {if(*(p1+i)==*(p2+j))
       {j++;
       x=j;
       }

   else
   {
     j=0;
     if(*p2==*(p1+i-x+1))
     j++;
     i=i-x+1;
   }
   if(j==len2)
   {
    k=i;
    j=0;
   }
  }
 }
 if(k)
 {for(i=0;i<k-len2+1;i++)
  p1++;
  return p1;
 }
 else 
 return NULL;
}

共有测试数据:5
平均占用内存:3.087K 平均CPU时间:0.80000S 平均墙钟时间:0.80854S

测试数据
评判结果
测试数据1
运行时间过长
测试数据2
输出错误
测试数据3
完全正确
测试数据4
运行时间过长
测试数据5
完全正确

代码贴得有些乱,少了很多内容,请用代码片格式化下,好帮你调试
目测
char sourcestr[100];
char substr[10];
这两个都很小,确认它们最多只有100个和10个字符么

老哥,代码贴得不太整齐,我就自己写了个,您看能不能通过那几个测试样例

#include<iostream> 
using namespace std;

int len(char *src){
    int i;
    for(i=0;*(src+i)!='\0';i++);
    return i;
}

int findLast(char*src,char*sub){
    int i,j,k;
    int m=len(src);
    int n=len(sub);
    if(m<1||n<1||m<n) return -1;
    i=m-1; //指向母串 
    j=n-1; //指向子串 
    k=m-1; //备份母串指针,即备份 i 
    while(i>=0&&j>=0){
        while(i>=0&&j>=0&&*(src+i)==*(sub+j)){
            i--;
            j--;
        }
        if(i<0||j<0){
            return i+1;
        }
        i=--k;
        j=n-1;
    }
    return -1;
}

int main(){
    char src[100],sub[10];
    gets(src);
    gets(sub);
    int n=findLast(src,sub);
    cout<<n;
    return 0;
}