帮我看看这个C语言代码,在第一次循环中没有问题.第二次循环,当提示输JDM的时候直接就跳过去了,求解答
#include"stdio.h"#defineNUM3structmem{intID;intJDM;doubleJDX;doubleJDY;};main(){struc...
#include"stdio.h"
#define NUM 3
struct mem
{
int ID;
int JDM;
double JDX;
double JDY;
};
main()
{
struct mem man[NUM];
int i,t;
char k;
double l;
for(i=0;i<NUM;i++)
{
printf("input JDM:");
gets(man[i].JDM);
printf("input JDX:");
scanf("%lf",&l);
man[i].JDX=l;
printf("input JDY:");
scanf("%lf",&l);
man[i].JDY=l;
man[i].ID=i;
/*L10: printf("go on? (Y/N):");
k=getchar();
if(k=='n'||k=='N') break;
else if(k=='y'||k=='Y') continue;
else goto L10;*/
}
printf("ID\tJDM\t\t\tJDX\t\t\tJDY\n\n");
for(t=0;t<i+1;t++)
printf("%d\t%s\t\t\t%f\t\t%f\n",man[t].ID,man[t].JDM,man[t].JDX,man[t].JDY);
}
int JDM 这个是失误,因该是字符串型,,之后修改成char JDM[20],,问题依旧 看了网上知道原因了,是因为第一次循环执行后有个""回车""还在缓存里,当循环第二次时gets()遇到缓存里的回车自动存入"回车"所以回出现没有输入这一项就跳到下一项了,,在gets()语句下面再加一条getchar() 空读一个回车,可以解决.. 展开
#define NUM 3
struct mem
{
int ID;
int JDM;
double JDX;
double JDY;
};
main()
{
struct mem man[NUM];
int i,t;
char k;
double l;
for(i=0;i<NUM;i++)
{
printf("input JDM:");
gets(man[i].JDM);
printf("input JDX:");
scanf("%lf",&l);
man[i].JDX=l;
printf("input JDY:");
scanf("%lf",&l);
man[i].JDY=l;
man[i].ID=i;
/*L10: printf("go on? (Y/N):");
k=getchar();
if(k=='n'||k=='N') break;
else if(k=='y'||k=='Y') continue;
else goto L10;*/
}
printf("ID\tJDM\t\t\tJDX\t\t\tJDY\n\n");
for(t=0;t<i+1;t++)
printf("%d\t%s\t\t\t%f\t\t%f\n",man[t].ID,man[t].JDM,man[t].JDX,man[t].JDY);
}
int JDM 这个是失误,因该是字符串型,,之后修改成char JDM[20],,问题依旧 看了网上知道原因了,是因为第一次循环执行后有个""回车""还在缓存里,当循环第二次时gets()遇到缓存里的回车自动存入"回车"所以回出现没有输入这一项就跳到下一项了,,在gets()语句下面再加一条getchar() 空读一个回车,可以解决.. 展开
5个回答
展开全部
“直接就跳过去了”是什么意思?跳到哪里去了?有可能是内存溢出了,“gets(man[i].JDM)”实际上是将“man[i].JDM”当成了地址,把读取的结果存放在这个地址中,如果这个地址范围很小,就很容易溢出,根据你下面的程序,正确的写法应该是 gets(&man[i].JDM);事实上你定义int JDM,最多也只有64位宽,gets函数不会判断上限, 输入字符串还是容易溢出。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
gets(man[i].JDM);为啥要用gets给整形数赋值?而且内部也不对,gets需要地址,你直接给了个int,
要用gets也是gets(&man[i].JDM)
要用gets也是gets(&man[i].JDM)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
gets(man[i].JDM);
这个是得到一个字符串,JDM是int
修改为
scanf("%d", &man[i].JDM);
这个是得到一个字符串,JDM是int
修改为
scanf("%d", &man[i].JDM);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
将gets改成scanf应该没问题了,我以前也遇到过内似的问题。好像与gets函数本身有关系。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
为什么用gets() ????
类似于你的这个方法去JDM不就行了?
scanf("%lf",&l);
man[i].JDX=l;
类似于你的这个方法去JDM不就行了?
scanf("%lf",&l);
man[i].JDX=l;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询