阿飞 发表于 2011-12-18 12:51:10

纠结了好久的问题

代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
int len;
int cnt;
int *pbase;
}Arr;
void Init(Arr *p)
{
p->pbase=(int *)malloc(sizeof(int) * 5);
if(NULL == p->pbase)
{
printf("动态内存分配失败\n");
exit(-1);
}

int i;
for(i=0; i<5; i++)
{
printf("请输入第%d个数据:", i+1);
scanf("%d\n", &(p->pbase));
printf("第%d个数据是:%d ", i+1,p->pbase);
}
p->len = 5;
p->cnt = 5;

return ;
}

void show(Arr *p)
{
printf("5个数据分别是:");
int i;
for(i=0; i<p->cnt; i++)
{
printf("%d ", p->pbase);
}

return;
}
void main(void)
{
Arr a;
Init(&a);
show(&a);

return;
}输出结果居然是:
请输入第1个数据:12
23
第1个数据是:12   请输入第2个数据:34
第2个数据是:23   请输入第3个数据:45
第3个数据是:34   请输入第4个数据:56
第4个数据是:45   请输入第5个数据:67
第5个数据是:56   5个数据分别是:12   23   34   45   56   Press any key to continu

之前遇到过类似的问题,没在意,前几天又遇到了这个的问题,所以开始思考了,几天了,想不出是什么原因。
求各位大哥大姐给小弟解释解释,感激不尽!

hubimaso 发表于 2011-12-20 19:08:55

搞出来没?

bbchylml 发表于 2011-12-21 12:34:18

这些天很忙所以没有上来看,你这问题是出现在scanf()函数的应用,scanf("%d\n", &(p->pbase));
\n是换行符,加入\n后,表示你输入一个整型数后还要输入一个,然后敲回车。去掉就可以解决问题了。
{:5_91:}
我还想问问你
int cnt;
好像与len一样,我不知道有什么意义,哈哈,我也顺便改了一下代码

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int len;
int cnt;
int *pbase;
}Arr;
//初始化数组
void Init(Arr *p)
{
p->pbase=(int *)malloc(sizeof(int *)*5);//给数组分配内存
p->len = 5;//初始化数组长度
if(NULL == p->pbase)
{
printf("动态内存分配失败\n");
exit(-1);
}
printf("系统获得该数组的长度为:%d\n", p->len);
for(int i=0; i<p->len; i++)
{
printf("请输入第%d个数据:", i+1);
scanf("%d", &(p->pbase));
printf("第%d个数据是:%d ",i+1,p->pbase);
}
printf("\n");
}
//显示数组
void show(Arr *p)
{
printf("5个数据分别是:");
int i;
for(i=0; i<p->len; i++)
{
printf("%d ", p->pbase);
}
}
void main(void)
{
Arr a;
Init(&a);
show(&a);
}

阿飞 发表于 2011-12-21 14:44:13

bbchylml 发表于 2011-12-21 12:34 static/image/common/back.gif
这些天很忙所以没有上来看,你这问题是出现在scanf()函数的应用,
\n是换行符,加入\n后,表示你输入一个整 ...

len是数组内当前元素个数,cnt是数组长度!

YJL 发表于 2011-12-22 22:17:36

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int len;
int cnt;
int *pbase;
}Arr;
void Init(Arr *p)
{
        int i;
p->pbase=(int *)malloc(sizeof(int) * 5);
if(NULL == p->pbase)
{
printf("动态内存分配失败\n");
exit(-1);
}

for(i=0; i<5; i++)
{
printf("请输入第%d个数据:", i+1);
scanf("%d", &(p->pbase));
printf("第%d个数据是:%d ", i+1,p->pbase);
}
p->len = 5;
p->cnt = 5;

return ;
}

void show(Arr *p)
{
int i;
printf("5个数据分别是:");

for(i=0; i<p->cnt; i++)
{
printf("%d ", p->pbase);
}

return;
}
void main(void)
{
Arr a;
Init(&a);
show(&a);

return;
}

YJL 发表于 2011-12-22 22:20:51

总的来说又两个错误,第一个就是int i,放在程序后面,定义变量时要注意一定要放在程序前,以防止有些的编译器会报错,还有就是楼上说的scanf("%d\n",&(p->pbase)),一般scanf不要用\n,因为这输入的时候容易出错,不知道我这样说你听得懂不

阿飞 发表于 2011-12-24 12:28:13

YJL 发表于 2011-12-22 22:20 static/image/common/back.gif
总的来说又两个错误,第一个就是int i,放在程序后面,定义变量时要注意一定要放在程序前,以防止有些的编译 ...

明白了,谢谢啊!

紫炎 发表于 2011-12-25 16:11:12

学会匈牙利命名法,又不加标注别人是看不懂得

阿飞 发表于 2011-12-28 21:27:48

紫炎 发表于 2011-12-25 16:11 static/image/common/back.gif
学会匈牙利命名法,又不加标注别人是看不懂得

恩,谢谢!
页: [1]
查看完整版本: 纠结了好久的问题