请教一个c语言程序,请问这个程序是干什么的,并解释一下mystery是怎么运行的?

#include<stdio.h>intmain(void){structdata{longl;char*s;shortinti;charc;shortinta[5];}... #include<stdio.h>

int main(void)
{
struct data
{
long l;
char *s;
short int i;
char c;
short int a[5];
}d;

struct data *p = &d;

printf("%d\n",sizeof(d));
printf("%x\t%x\n",p,p+1);
printf("%x\t%x\n",p,(char *)p+1);
printf("%x\t%x\n",p,(long *)p+1);

return 0;
}
for语句中给成如下运行结果一样,但是上边的for语句第二项*s1=*s2怎么是赋值而不是条件?
for(;*s2!='\0';s1++,s2++)
{
*s1 = *s2;
}
int main(void)
{
char string1[80];
char string2[80];
printf("Enter two strings: ");
scanf("%s%s",string1,string2);
mystery(string1,string2);
printf("%s",string1);
return 0;
}
void mystery(char *s1,char *s2)
{
while(*s1 != '\0')
{
s1++;
}
for(;*s1=*s2;s1++,s2++)
{
;
}
展开
 我来答
照例悦读
2012-02-05 · TA获得超过404个赞
知道答主
回答量:128
采纳率:50%
帮助的人:19.5万
展开全部
c语言程序通讯录管理程序,目 标:编写程序,建立一个通讯录,存放有姓名、电话号码、住址等,具备输入、查找、添加、修改及删除等功能。
要 求:具备菜单功能或详细的提示功能,至少具备数据输入、输出、查询、删除、文件保存、文件读入中的两项功能。能力强的同学可以设计表格化输出。熟练掌握文件或结构体的操作,程序中至少要有一个自定义结构体。总程序量不少于100行,输出数据要进行适当美化。程序要有详细的注释及必要的说明文档
mystery运行的如下:
public class Mystery {

String s;
void Mystery(){
s = "construct";
}
void go(){
System.out.println(s);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Mystery a = new Mystery();
a.go();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
无病呻吟2010
2012-02-05 · TA获得超过963个赞
知道小有建树答主
回答量:527
采纳率:0%
帮助的人:575万
展开全部
应该是测试编译出来后结构体struct data的内存分配情况

#include<stdio.h>

int main(void)
{
struct data
{
long l;
char *s;
short int i;
char c;
short int a[5];
}d;

struct data *p = &d;

printf("%d\n",sizeof(d)); /* 总共分配了多少内存 */
printf("%x\t%x\n",p,p+1); /* d的地址,和d后面的一个单位的地址 */
printf("%x\t%x\n",p,(char *)p+1); /* d的地址,d后面一个字符单位的地址(由于强行转化成char *,而char占一个字节 */
printf("%x\t%x\n",p,(long *)p+1); /* d的地址,d后面一个long单位的地址 */

return 0;
}
更多追问追答
追问
程序是下边的上边的给错了,不好意思。for语句看不懂 不过改成如下
for(;*s2!='\0';s1++,s2++)
{
*s1 = *s2;
}
运行结果一样,不知道为什么?
追答
从这个程序看,mystery应该是将string2,链接在string1的后面
void mystery(char *s1,char *s2)
{
while(*s1 != '\0')
{
s1++;
}/*此时s1只想的是s1字符串的最后的那个'\0'位置处 */
for(;*s1=*s2;s1++,s2++) /* 从s1开始的那个'\0'处开始赋值,当 (*s1 = *s2)的值为0时,即赋值之后*s1的值为0(相当于'\0')的时候循环结束。 此效果刚好相当吧s2的整个字符串粘在s1的后面了 */
{
;
}
}

改成这样
for(;*s2!='\0';s1++,s2++)
{
*s1 = *s2;
}
结果不应该是一样的,它没有将最后的'\0'放在s1的最后面,会导致输出的时候以为字符串还没有结束,继续输出,而后面的字符时未定义的。

如果你试验的效果是一样,我只能说是巧合,刚好后面未定义的字符时'\0'
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式