C语言编程问题!!高手救命,在线等答案

#include"stdio.h"#definen5structstudent{intnum;charname[20];floatc;floatjava;};voidma... #include "stdio.h"
#define n 5
struct student
{
int num;
char name[20];
float c;
float java;
};

void main()
{
struct student stu[n];
int i;
for(i=0;i<n;++i)
{
stu[i].num=i+1;
printf("姓名\n");
fflush(stdin);
gets(stu[i].name);
printf(" C分数\n");
scanf("%f",&stu[i].c);
printf("JAVA分数\n");
scanf("%f",&stu[i].java);
}
}

这是一个简单的录入结构信息,为什么我录入C的分数后,就会显示错误:
Debug error!
program F:\c\TempFile.exe
runtime error
(Press Retry to debug the application)
如果我在输入C成绩后不输入数字,输入字母的话就不报错,但是会跳过JAVA的录入,直接让我录入姓名。
高手99我。。。。会不会是我的软件有问题,我用的是《C与C++程序设计学习与实验系统 2008》,不是标准的C++软件,是一个小型的Turbo C专用的小型软件
展开
 我来答
风骚的可乐
2007-12-07 · TA获得超过1551个赞
知道小有建树答主
回答量:412
采纳率:0%
帮助的人:656万
展开全部
分析过程:

重新定义结构体:
typedef struct student {
float c;
float java;
} STU;
然后在for循环内仅使用:
scanf("%f",&stu[i].c); // 或者&(stu[i].c)
scanf("%f",&stu[i].java); // 或者&(stu[i].java)

问题依旧。

但如果此时已经定义了float fTmp;并在循环体内这样写:
scanf("%f",&fTmp);
stu[i].c = fTmp;
scanf("%f",&fTmp);
stu[i].java = fTmp;
则问题得到解决。

几经修改,最后改成最原先的代码,问题也不存在了,无语……

原因分析:
可能是C运行库的问题,代码方面理论上没有任何问题的。

另外,对于应该输入float的时候用户输入char导致跳过某些变量输入的情况,这和scanf内部实现的机制有关,因为它是靠类型指针来获取对应值的,那么如果对于普通类型(比如float,VC6中为4字节)变量,如果用户的录入有问题(比如char*),scanf会直接跳过当前变量的赋值。针对这种情况,如果非要用C语言而不是C++的话,那么目前还没有好的防止错误或者在输入错误时给出提示的方法。

以下是模拟错误的执行过程:

姓名:张三
C分数:12
JAVA分数:12
姓名:王
C分数:99
JAVA分数:66
姓名:刘
C分数:34
JAVA分数:56
姓名:陈
C分数:aa
JAVA分数:姓名:cc
C分数:bb
JAVA分数:

<01> [0x0013FEE4] 12.00 [0x0013FEE8] 12.00 "张三"
<02> [0x0013FF04] 99.00 [0x0013FF08] 66.00 "王"
<03> [0x0013FF24] 34.00 [0x0013FF28] 56.00 "刘"
<04> [0x0013FF44] -107374176.00 [0x0013FF48] -107374176.00 "陈"
<05> [0x0013FF64] -107374176.00 [0x0013FF68] -107374176.00 "cc"
Press any key to continue

用于模拟该错误的代码如下:

#include "stdio.h"
#define n 5
struct student
{
int num;
float c;
float java;
char name[20];
};

void main()
{
struct student stu[n];
int i;
for(i=0;i<n;++i)
{
stu[i].num=i+1;
printf("姓名:");
fflush(stdin);
gets(stu[i].name);
printf(" C分数:");
scanf("%f",&stu[i].c);
// printf("[0x%08X] size:%3d\n",&(stu[i].c),sizeof(stu[i].c));
printf(" JAVA分数:");
scanf("%f",&(stu[i].java));
}
printf("\n\n");
for(i=0;i<n;++i)
{
printf("<%02d> [0x%08X] %.2f [0x%08X] %.2f \"%s\"\n",stu[i].num, &(stu[i].c),stu[i].c,&(stu[i].java),stu[i].java,stu[i].name);
}
}
qizhi0119
2007-12-07 · TA获得超过357个赞
知道小有建树答主
回答量:510
采纳率:0%
帮助的人:273万
展开全部
还真没看出来错哪了,不过,我把你上面C的注释掉,发现你的JAVA的是好用的,所以,我就把你的JAVA的复制上去,然后把JAVA改成C,也好用了。。。
#include "stdio.h"
#define n 5
struct student
{
int num;
char name[20];
float c;
float java;
};

void main()
{
struct student stu[n];
int i;
for(i=0;i<n;++i)
{
stu[i].num=i+1;
printf("姓名\n");
//fflush(stdin);
gets(stu[i].name);
//printf(" C分数\n");
//scanf("%f",&stu[i].c);
printf(" C分数\n");
scanf("%f",&stu[i].c);
printf("JAVA分数\n");
scanf("%f",&stu[i].java);
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
detax
2007-12-07 · TA获得超过2.6万个赞
知道小有建树答主
回答量:1335
采纳率:64%
帮助的人:529万
展开全部
这个是tubor c 的一个bug。

应该像楼上说的那样,先用一个临时变量来读入,然后再赋值给结构体变量。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yhy19820816
2007-12-07 · TA获得超过304个赞
知道小有建树答主
回答量:308
采纳率:0%
帮助的人:368万
展开全部
printf("score\n");
scanf("%f",&c);
stu[i].c=c;
printf("JAVA score\n");
scanf("%f",&java);
stu[i].java=java
定义两个变量试下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
thgfwhb
2007-12-07 · TA获得超过181个赞
知道小有建树答主
回答量:469
采纳率:0%
帮助的人:0
展开全部
正如qizhi0119所说,确实是这种情况。搞不懂怎么回事。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式