在字符串hello后面加123456,这个代码哪里不对

#pragma warning (disable:4996);
void my_strcat(char*p, char*q)
{
    int n = strlen(p);
    printf("n=%d\n", n);
    int j = strlen(q);
    printf("j=%d\n", j);
    int i = 0;
    for (int i = 0; i <=j; i++)
    {
        *(p + i + n) = *(q + i);
    }
    *(p + i + n) = 0;
}
int main()
{
    char str1[128] = "hello";
    char str2[128] = "123456";
    my_strcat(str1, str2);
    printf("%s\n", str1);
    system("pause");
    return 0;    
}

问题是在你得函数my_strcat里你定义了两个范围不同的变量i。在for循环前定义了int i = 0;然后这个变量i一直没有改变过。在for循环里定义了范更小的变量i,它从0 到6.但是循环结束它就消失了。到  *(p + i + n) = 0;时,用到的i时一直没有改变的i= 0。所以拷贝的123456在1处被写了'\0'终止字符串了。其实你不要  *(p + i + n) = 0;也没问题了,因为for循环到j把第二个串的结束符号=也拷贝了。

#pragma warning (disable:4996);
#include <stdio.h>
#include <string.h>

void my_strcat(char*p, char*q)
{
    int n = strlen(p);
    printf("n=%d\n", n);
    int j = strlen(q);
    printf("j=%d\n", j);

    for (int i = 0; i <= j; i++)
    {
        *(p + i + n) = *(q + i);
    }
    *(p + j + n) = 0;
}
int main()
{
    char str1[128] = "hello";
    char str2[128] = "123456";
    my_strcat(str1, str2);
    printf("%s\n", str1);
    system("pause");
    return 0;    
}

// Output
n=5
j=6
hello123456

 

输出的结果是?

在my_strcat函数中,

int i = 0;  //这里是第一个i

 for (int i = 0; i <=j; i++) //这里你重新声明了一个i(第二个i),而且i<=j 应该是i<j
    {
        *(p + i + n) = *(q + i);
    }//for里的i的作用域在这里就结束了

 *(p + i + n) = 0;//这里的i使用的是第一个i,它的值还是0

所以结果错误了。可以把for (int i = 0; i <=j; i++)改成for ( i = 0; i <j; i++)

如有帮助,请采纳一下,谢谢。