(c语言的)为什么oj平台一直显示运行时错误?

图片说明

#include<stdio.h>
int myStrLen(char *s);
void myStrConcat(char *string1, char *string2);
int main()
{
    int n, i, a, b, c[10];
    char s[10][41];
    scanf("%d %d %d", &n, &a, &b);
    for (i = 0; i < n; i++)
        scanf("%d", &c[i]);
    for (i = 0; i < n; i++)
        scanf("%s", s[i]);
    myStrConcat(s[a], s[b]);
    for (i = 0; i < n; i++)
    {
        printf("%d", myStrLen(s[i]));
        if (s[i + 1])
            printf(" ");
    }
    printf("\n");
    for (i = 0; i < n; i++)
    {
        printf("%s", s[c[i]]);
        if (i < n - 1)
            printf("\n");
    }

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

错误原因myStrConCat函数,两个字符串拼接,当两个字符串特别长的时候,就需要动态分配内存来完成。
char *str_after_concat=(char*)malloc ( sizeof(char) * (myStrLen(string1)+mystrLen(string2)+1));这里的+1是因为我们将要返回一个C风格的字符串,
即字符串末尾以\0结尾。
那么至于你的myStrLen的for函数,可以换成 for (i = 0; s[i]; i++);这种看着很简洁。也可以不用这种方法,有很多不做举例。
那么上面进行新建了函数,那么后面的逻辑就差不多正确了,只需要将string1换成前面我的代码所创建的变量 str_after_concat
然后并且将这个指针返回并输出(因为malloc是在堆中动态分配,不会像局部变量一样回收。)

`#include
int myStrlen(char s[]);
void myStrConcat(char string1[],char string2[]);
int main()
{
int n,a,b;
int c[10],i,j;
char str[10][40];
char * p1, * p2;
scanf("%d%d%d",&n,&a,&b);
for(i=0;i<n;i++)
{
scanf("%d",&c[i]);
}
for(i=0;i<n;i++)
{
scanf("%s",str[i]);
}
if(a!=b)
myStrConcat(str[a],str[b]);
else if(a==b)
{
i=myStrlen(str[a]);
p1=&str[a][i];
p2=&str[b][0];
for(j=0;j<i;j++)
{

*p1=*p2;
p1++;
p2++;
}

  }
for(i=0;i<n;i++)
{
    printf("%d ",myStrlen(str[i]));
}
printf("\n");
for(i=0;i<n;i++)
{
    printf("%s\n",str[c[i]]);
}
return 0;

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

}

问一下我这个代码,为什么完成不了这一步呢?该函数的两个参数,在调用时有可能会指向同一个字符串,函数需要在这种情况下能正确完成指定的功能。