主题:有两句看不懂,求讲解。
qq312448494
[专家分:0] 发布于 2011-12-24 14:44:00
#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个回复)
沙发
windy0will [专家分:2300] 发布于 2011-12-24 21:17:00
第一个循环写错了吧?应该不要==NULL.第一个循环历遍字符串s1,然后停在字符串最后.第二个循环把s2字符串复制到s1后面。
板凳
windy0will [专家分:2300] 发布于 2011-12-24 21:53:00
还有,第二个循环好像也是错的,应该改为
while((*ps1++ = *ps2++) != '\0') { }
3 楼
qq312448494 [专家分:0] 发布于 2011-12-25 01:10:00
这个题目不知道有没有错。。是C语言的考题。。
4 楼
windy0will [专家分:2300] 发布于 2011-12-25 08:38:00
不管这是不是考题,但那段代码确实写得不怎么严谨。就只说两个循环:第一个,*ps1是char类型,NULL是void*类型,并且也没有规定它的值就是0,也许有些平台是其他值。第二个循环没有把s2最后的空字符复制到s1后面,有时候这会引起问题,虽然这里不会,因为s1是数组,在初始化时会自动添加0。
5 楼
tshag [专家分:0] 发布于 2012-01-15 13:35:00
windyQwill 讲解很好啊,学了,谢谢
6 楼
fastfly [专家分:380] 发布于 2012-01-15 14:12:00
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 楼
lenderfox [专家分:10] 发布于 2012-02-02 21:04:00
s1没有分配足够的内存空间.如果s1、s2内存空间连续的话,输出应为'ABCxyzz',多个'z'
8 楼
Spears [专家分:10] 发布于 2012-02-05 16:38:00
其实,在<stdio.h>头文件中,已有定义“#define NULL 0”,所以,第二个循环式没有问题的。
我来回复