San Jose各个房价 <1.5m 区域买房总结

一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
码农求职神器Triplebyte:
不用海投
内推多家公司面试
坐标湾区
Games Startup
招聘游戏开发工程师
游戏初创公司招聘工程师、UIUX Designer和游戏策划
把贵司招聘信息放这里
查看: 880|回复: 4
收起左侧

这一小段代码为什么会出现死循环。。。

[复制链接] |试试Instant~ |关注本帖
bryanjhy 发表于 2015-1-25 21:50:39 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?Sign Up 注册获取更多干货

x
#include<stdio.h>
. 围观我们@1point 3 acres
int main (void)
{.本文原创自1point3acres论坛
        float a;
        float c=1;
.留学论坛-一亩-三分地        while(scanf("%f", &a)!=1)
        {-google 1point3acres
                printf("This is not a number.\n");
                printf("Please enter another number.\n");

        }
        return 0;
}
这是在vc++6.0跑的一段c语言代码,目的是为了确保用户最终输入浮点数,并将值赋给a,本来打算是如果输入一个‘k’,再按一下回车,就会出现那两行语句,并可以重新输入,但是结果却是个死循环。。。这是为神马,.1point3acres网
#include<stdio.h> 来源一亩.三分地论坛.

int main (void)
{
        float a;. 1point 3acres 论坛
        float c=1;
        while(scanf("%f", &a)!=1). from: 1point3acres
        {-google 1point3acres
                printf("This is not a number.\n");
                printf("Please enter another number.\n");
                while(getchar()!='\n');. 一亩-三分-地,独家发布

        }
        return 0;
}
我加了其中一句就没有这种问题了,但是不知道为什么。。。是scanf的机制问题么。。。。我是编程新手。。。



补充内容 (2015-1-25 21:51):
下面那段那个“float c=1”可以无视。。。。
weihu816 发表于 2015-1-25 22:43:09 | 显示全部楼层
回复 支持 反对

使用道具 举报

mouwu.lin 发表于 2015-1-25 22:52:00 | 显示全部楼层
fload类型是浮点型用来存储有理数。计算机是基于二进制的,也就是说不论整型还是浮点型,都是用二进制存储。这样就导致小数部分的存储不精确,你输入的1,在有理数机制里来看就是1.0000000000....那么存储的时候就可能是1.00000000000001也可能是0.99999999998这样非常接近1的数字。假设存储时是用的0.99999999998,那你再读入一个数字1时,可能是用0.99999999999来存储,两个就不匹配了。所以小数的需要用绝对值函数来判断,例如判断a和b是不是一个相同的实数,可以用fabs(a-b)<0.0000001这样一个绝对小量来判断。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| bryanjhy 发表于 2015-1-25 22:58:41 | 显示全部楼层
mouwu.lin 发表于 2015-1-25 22:52. 1point3acres
fload类型是浮点型用来存储有理数。计算机是基于二进制的,也就是说不论整型还是浮点型,都是用二进制存储 ...

那个死循环是在我输入‘k’之后才出现的问题,与float其实没什么关系吧,其实如果把float改成int,把%f改成%d,死循环还是会出现的样子
回复 支持 反对

使用道具 举报

 楼主| bryanjhy 发表于 2015-1-25 23:15:23 | 显示全部楼层
weihu816 发表于 2015-1-25 22:43. 牛人云集,一亩三分地
http://blog.csdn.net/hackbuteer1/article/details/6704779

我好像明白了,那个‘k’没有被scanf读取,所以一直存在缓冲区里面,而scanf一直在从缓冲区读取,也就是缓冲区的出入口被那个‘k’堵住了,所以就变成了死循环,谢谢啦
回复 支持 反对

使用道具 举报

本版积分规则

提醒:发帖可以选择内容隐藏,部分板块支持匿名发帖。请认真读完以下全部说明:

■隐藏内容方法: [hide=200]你想要隐藏的内容比如面经[/hide]
■意思是:用户积分低于200则看不到被隐藏的内容
■可以自行设置积分值,不建议太高(200以上太多人看不到),也不建议太低(那就没必要隐藏了)
■建议只隐藏关键内容,比如具体的面试题目、涉及隐私的信息,大部分内容没必要隐藏。
■微信/QQ/电子邮件等,为防止将来被骚扰甚至人肉,以论坛私信方式发给对方最安全。
■匿名发帖的板块和方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2018-5-27 00:14

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表