一个c的小程序陷入死循环!!
我想让他输入小数时不执行中间循环部分,直接跳到开始重新输入p,但却陷入死循环,求指导。。#include<stdio.h>intmain(void){inti,j,n,p...
我想让他输入小数时不执行中间循环部分,直接跳到开始重新输入p,但却陷入死循环,求指导。。
#include <stdio.h>
int main(void)
{
int i,j,n,p,q;
A:
printf("输入一个自然数!!:");
scanf("%d",&p);
if((int)p-p==0)
{
i=1,j=p-1;
for(q=p*2-1;q>0;q--)
{
if(q>p)
{
for(n=j;n>0;n--)
printf(" ");
for(n=i;n>0;n--)
printf("*");
printf("\n");
i+=2,j--;
}
if(q<=p)
{
for(n=j;n>0;n--)
printf(" ");
for(n=i;n>0;n--)
printf("*");
printf("\n");
i-=2,j++;
}
}
}
// else
// printf("error!!!");
goto A;
} 展开
#include <stdio.h>
int main(void)
{
int i,j,n,p,q;
A:
printf("输入一个自然数!!:");
scanf("%d",&p);
if((int)p-p==0)
{
i=1,j=p-1;
for(q=p*2-1;q>0;q--)
{
if(q>p)
{
for(n=j;n>0;n--)
printf(" ");
for(n=i;n>0;n--)
printf("*");
printf("\n");
i+=2,j--;
}
if(q<=p)
{
for(n=j;n>0;n--)
printf(" ");
for(n=i;n>0;n--)
printf("*");
printf("\n");
i-=2,j++;
}
}
}
// else
// printf("error!!!");
goto A;
} 展开
3个回答
展开全部
你定义p为int类型,输入的格式也是%d,这些都是对的
但是当你输入一个浮点数,比如5.6时,scanf从缓存区读取数据5,遇到小数点结束读取,此时缓存区数据为.6,第二次循环因为缓存区存在数据,不在接受键盘输入,而是直接从缓存区读取数据,但是遇到小数点读取失败,而p的值仍是5,输出图案,进入下一个循环.....无限死循环.....
其实这就是由于使用scanf时输入的数据类型和需要的数据类型不匹配造成的。
http://hi.baidu.com/gsyhjcqhgwbcizq/item/0038048367904beab0715443
解决方式是在每次循环之后,情况缓存区,fflush(stdin);
如果修改定义p为float,你需要另定义一个int pp,来保存p的整数部分,因为不可能在以后的程序中使用p时都对其强制转换吧,这样太不方便了
但是当你输入一个浮点数,比如5.6时,scanf从缓存区读取数据5,遇到小数点结束读取,此时缓存区数据为.6,第二次循环因为缓存区存在数据,不在接受键盘输入,而是直接从缓存区读取数据,但是遇到小数点读取失败,而p的值仍是5,输出图案,进入下一个循环.....无限死循环.....
其实这就是由于使用scanf时输入的数据类型和需要的数据类型不匹配造成的。
http://hi.baidu.com/gsyhjcqhgwbcizq/item/0038048367904beab0715443
解决方式是在每次循环之后,情况缓存区,fflush(stdin);
如果修改定义p为float,你需要另定义一个int pp,来保存p的整数部分,因为不可能在以后的程序中使用p时都对其强制转换吧,这样太不方便了
展开全部
你好,你的问题出在p的定义和使用上,你定义的p是int型,scanf也用的%d控制输入,所以即使你输入的数含有小数,系统也会自动舍弃小数部分而将其视为整数,所以导致你的if语句一直为真
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-03-08
展开全部
因为你宣告 int p, 又scanf("%d",&p);
所以即使input 小数点,(int)p==p is true
建议修改如下:
float p;
scanf("%f",p);
所以即使input 小数点,(int)p==p is true
建议修改如下:
float p;
scanf("%f",p);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询