自编函数实现strlen 和strcat 我的代码测试结果没问题但是现实运行时错误 求解答

首先请实现如下两个函数(要自己写代码完成,不允许直接调用库函数):
int myStrLen(char *s);
该函数功能为求字符串s的长度。
void myStrConcat(char *string1, char *string2);
该函数的功能为将字符串string2拼接至字符串string1后边。注意:该函数的两个参数,在调用时有可能会指向同一个字符串,函数需要在这种情况下能正确完成指定的功能。

主函数要求使用以上两个函数实现如下功能:
输入:
第一行为三个整数n(0<n<10),a,b, 第二行为n个整数,后边为n行字符串,每个字符串长度不超过20。
输出:
要求首先将第b行字符串拼接至第a行的字符串后再输出。
第一行为n个用单个空格分隔的整数(最后一个数后无空格),为按各字符串的输入次序输出的各字符串的长度。
后边n行为将输入的字符串按输入的第2行给出的顺序依次输出。
输入保证合法且字符串中不包含空格。

#include<stdio.h>
int myStrLen(char s[]); 
void myStrConcat(char string1[], char string2[]);
int main()
{
    int n,a,b,i,j;
    int k[20];
    char c[20][100]={"0"};
    scanf("%d%d%d",&n,&a,&b);
    for(i=0;i<n;i++)scanf("%d",&k[i]);
    for(i=0;i<n;i++){
        getchar();
        scanf("%s",c[i]);
    }
    myStrConcat(c[a],c[b]);
    for(i=0;i<n;i++){
        if(i==0)printf("%d",myStrLen(c[i]));
        else printf(" %d",myStrLen(c[i]));
    }
    printf("\n");
    for(i=0;i<n;i++)printf("%s\n",c[k[i]]);
    return 0;
} 


void myStrConcat(char string1[], char string2[])
{
    int myStrLen(char s[]);
    int i,j,l1,l2;
    l1=myStrLen(string1);
    l2=myStrLen(string2);
    for(i=l1,j=0;string2[j]!='\0';i++,j++)string1[i]=string2[j];
    string1[l1+l2]='\0';
}


int myStrLen(char s[])
{
    int j=0,len=0;
    for(j=0;s[j]!='\0';j++,len++);
    return(len);
}

你的函数我测试了没有什么问题,应该是main输入输出的问题
getchar();
这是干嘛,它会吃掉字符

错误原因myStrConCat函数,两个字符串拼接,当两个字符串特别长的时候,就需要动态分配内存来完成。
char *str_after_concat=(char*)malloc ( sizeof(char) * (myStrLen(string1)+mystrLen(string2)+1));这里的+1是因为我们将要返回一个C风格的字符串,
即字符串末尾以\0结尾。只需要将string1换成前面我的代码所创建的变量 str_after_concat然后并且将这个指针返回并输出(因为malloc是在堆中动态分配,不会像局部变量一样回收。)你的getchar()可有可无,不是严格的输入输出,即字符级别的精准输入就不会有影响。

char* myStrConcat(char string1[], char string2[])
{
    int i,j,l1,l2;
    l1=myStrLen(string1);
    l2=myStrLen(string2);
    char *str_after_concat=(char*)malloc ( l1+l2+1));
    strcpy(str_after_concat,string1);
    strcpy(str_after_concat+l1,string2);
    return str_after_concat;
}

你这个地方的问题应该是题目中提到的myStrConcat函数的注意事项,另我也在做这个OJ题