c++,输出结果非常奇怪

#include<stdio.h>
#include <string.h>
void insert(char *s1,char *s2,int f)
{
int i,j,n1,n2;
n1= strlen(s1);
n2 =strlen(s2);
for(i=n1-1,j=n1+n2-1;i>f-1;i--,j--)
{
s1[j]=s1[i];
}
for(i=f-1;*s2!='\0';i++,s2++)
{
s1[i]=*s2;
}
s1[n1+n2]='\0';
n1= strlen(s1);
printf("%d,%d,%c\n",n1,n2,s1[6]);
printf("%c\n",s1[6]);
printf("%s\n",s1);
}
int main()
{
char a1[100]={"abcde"},a2[]="ABC";
int f=3;
insert(a1,a2,f);
printf("%s",a1);
return 0;
}

在主函数main中定义了两个字符数组a1和a2,都是字符串常量初始化方式,内存分配时会在字符串尾部保存一个空字符'\0'。然后调用自定义函数insert,先求两个字符串的长度(不包含结尾的'\0'),所以n1等于5,n2等于3。

然后看第一个for循环,i的初值为4,j的初值为7。循环条件是i>2,第一次s1[7]=s1[4],赋值语句,把s1[4]的字符‘e’赋值给s1[7]。第二次s1[6]=s1[3],把s1[3]的字符‘d’赋值给s1[6],然后下一次不再满足循环条件,退出循环。

第二个for循环,i的初值为2。循环条件是*s2!='\0'。指针变量s2指向a2,也就是字符数组a2中的字符不为'\0'。第一次s1[2]=*s2,把a2的第一个字符'A'赋值给s1[2]。第二次s1[3]=*s2,把a2的第二个字符'B'赋值给s1[3]。第三次s1[4]=*s2,把a2的第三个字符'C'赋值给s1[4]。然后下一次不再满足循环条件,退出循环。

所以最后s1[6]等于'd',s1仍然指向字符串a1,不过变为'abABC',在上面所说的第二个for循环中重新复制了。当然a1也变为'abABC'。因为printf("%s\n",s1)遇到第一个'\0'就会结束,所以输出的结果都是'abABC'。看一下指针的知识就能理解这个程序了。基本就是这个过程吧。

追问

那s1不是指向a1吗,怎么a[6]不等于s[6]的

追答

是的,指针变量s1指向a1,所以s1[6]就等于数组a1的第七个元素a1[6]。不明白你说的“怎么a[6]不等于s[6]的”,可以输出看一下啊,在主函数中

int main()
{
char a1[100]={"abcde"},a2[]="ABC";
int f=3;
insert(a1,a2,f);
printf("a1 is %s\n",a1);
printf("a1[6] is %c\n",a1[6]);
return 0;
}

运行一下就看到结果了,可以看到s1[6]就等于a1[6],等于字符'd'。这是指针指向一维数组的知识,看一下书就能懂了吧。

追问

那为什么直接输出a1 只能输出abABC a[6]怎么不接着输出啊

追答

因为输出字符数组a1的语句

printf("a1 is %s\n",a1);

使用了%s作为格式符输出,所以执行这条语句时,从数组a1的第一个元素,也就是a1[0]开始输出字符,直到遇到第一个"\0"结束。由于a1[5]是空字符"\0",所以a1[6]此时不会输出,但是a1[6]并不是空字符"\0",a1[6]等于字符"d"。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-06-03
这样就对了:
#include<stdio.h>
#include <string.h>
void insert(char *s1,char *s2,int f)
{
int i,j,n1,n2;
n1=strlen(s1);
n2=strlen(s2);
for(i=n1-1,j=n1+n2-1;i>=f-1;i--,j--)
{ s1[j]=s1[i]; }
for(i=f-1;*s2!='\0';i++,s2++)
{ s1[i]=*s2; }
s1[n1+n2]='\0';
n1= strlen(s1);
printf("%d,%d,%c\n",n1,n2,s1[6]);
printf("%c\n",s1[6]);
printf("%s\n",s1);
}
int main()
{
char a1[100]={"abcde"},a2[]="ABC";
int f=3;
insert(a1,a2,f);
printf("%s",a1);
return 0;
}
相似回答