回 帖 发 新 帖 刷新版面

主题:有两句看不懂,求讲解。

#include<stdio.h>
#include<string.h>
main()
{
char s1[12]="ABC",s2[]="xyz";
char *ps1=s1,*ps2;
    ps2=s2;
    while(*ps1!=NULL)
        ps1++;
  while(*ps2)*(ps1++)=*(ps2++);
  printf("%s\n",s1);
getch();


}
程序输出结果是ABCxyz
两个while语句 看不懂。。

回复列表 (共8个回复)

沙发

第一个循环写错了吧?应该不要==NULL.第一个循环历遍字符串s1,然后停在字符串最后.第二个循环把s2字符串复制到s1后面。

板凳

还有,第二个循环好像也是错的,应该改为
while((*ps1++ = *ps2++) != '\0') { }

3 楼

这个题目不知道有没有错。。是C语言的考题。。

4 楼

不管这是不是考题,但那段代码确实写得不怎么严谨。就只说两个循环:第一个,*ps1是char类型,NULL是void*类型,并且也没有规定它的值就是0,也许有些平台是其他值。第二个循环没有把s2最后的空字符复制到s1后面,有时候这会引起问题,虽然这里不会,因为s1是数组,在初始化时会自动添加0。

5 楼

windyQwill  讲解很好啊,学了,谢谢

6 楼

main()
{
char s1[12]="ABC",s2[]="xyz"; //这里注意一点,s1开辟的很大“12”,为对接s2做好准备
char *ps1=s1,*ps2; //ps1指向 s1首地址,即指向 A 所在地址
    ps2=s2; //ps2指向s2首地址,即x所在地址
    while(*ps1!=NULL) //偏移ps1指针到 s1[3],即s1[3] == 0 (NULL),等同于(Label)
        ps1++; 

  while(*ps2)*(ps1++)=*(ps2++); // 从s1[3]地址开始,用s2里的值对其赋值,等同于(Label1:)
  printf("%s\n",s1);
getch();


}

Label:
int i = 0;
for (i = 0; 0 != s1[i]; i++)
{
   ps1 = &s1[i];
}
ps1 = &s1[i]; //这时候i==3

Label1:
int i = 0;
while(s2[i++]) s1[3+i] = s2[i]

或者: 

for (int i = 0; 0 != s2[i]; i++)
{
    s1[3+i] = s2[i];
}

希望能给你解释清楚

7 楼

s1没有分配足够的内存空间.如果s1、s2内存空间连续的话,输出应为'ABCxyzz',多个'z'

8 楼


其实,在<stdio.h>头文件中,已有定义“#define NULL 0”,所以,第二个循环式没有问题的。

我来回复

您尚未登录,请登录后再回复。点此登录或注册