#include "stdio.h"
#include "string.h"
int main()
{
char a[20],b[20];
int i,j=0;
printf("input a:");
gets(a);
printf("\n");
printf("input b:");
gets(b);
for(i=strlen(a);i<strlen(a)+strlen(b);i++)
{
a[i]=b[j];
j++;
}
printf("%s",a);
return 0;
}
主要是你每次循环都会计算strlen(a),当第一次循环时,a中的原有'\0‘字符就被覆盖了,导致后面循环过程中,strlen(a)会是一个比较大的值,不是a原先真是的长度了。如果你定义一个变量k=strlen(a),然后循环中写i<k+strlen(b),结果就不一样啦。
所以循环会执行到将b数组中的'\0'复制到a中,这时候下次循环strlen(a)就会马上使得条件不满足而循环结束
你在改变a的时候,strlen(a)也在不断延长,所以最后你在a后面贴了一堆东西,
首先将b全部贴在a后面了,然后继续往后扫描,恰好将b结尾的\0
贴在a后面,然后剩下的一推再贴在这个\0
后面
输出的时候,因为\0
及\0
之前的内存都是准确的,所以恰好可以输出想要的结果
你可以加入一些debug变量来打印整个过程
#include "stdio.h"
#include "string.h"
int main()
{
char a[20], b[20];
int i, j = 0;
printf("input a:");
gets(a);
printf("\n");
printf("input b:");
gets(b);
printf("%d %d\n", strlen(a), strlen(b));
for (i = strlen(a); i < strlen(a) + strlen(b); i++)
{
a[i] = b[j];
printf("%d\n",strlen(a));
j++;
}
printf("%s", a);
return 0;
}
可能是字符串最后刚好就是‘\0’