关于输入函数运行时输入的数据类型不对应编码时候给出的类型,为何不报错的问题

关于输入函数运行时输入的数据类型不对应编码时候给出的类型,为何不报错的问题

问题描述:

为什么运行时候我输入的数据类型不是提示要求的类型数据时,没有报错呢,只能根据结果判断出现了数据乱套拆分的情况,是C语言中没有这个检测吗?如果没有找到对应的数据类型,就会这样子呢?


相关截图:

https://img1.sycdn.imooc.com/climg/673b12a609b3443615290552.jpg


想知道为何后面两种错误的输入方式,不报错得到的结果的过程,请老师解答。

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
中年猿叔 2024-11-19 07:14:02
可以通过scanf返回值来判断是否输入成功,要输入两个数据,成功scanf会返回2,可以通过返回值是否是2,判定是否输入成功!
  • 提问者 慕九州9493288 #1

    问题描述:

    通过scanf返回值的结果判断这个输入是否成功,以下是验证结果,对于结果还是不太理解,最后补充一下自己的猜测逻辑,想求证这个数据结果的过程是怎样的?



    相关截图:

    https://img1.sycdn.imooc.com/climg/673bfc6509faf53014690505.jpg








    观察数据猜测:

    ① 绿色框第一组输入数据,按照提示要求输入,得到scanf返回值2,代表输入成功,并且得到正确的数据结果。符合预期结果测试通过!

    ②红色框第二组输入数据,第一次输入-10 -20.2  ,scanf返回值2输入成功,此时x=-10 y =-20; 

    第二次输入2.33 3.5 scanf返回值2也输入成功,此时b=0.2 c=2.33 。不符合预期结果测试不通过!

    ③红色框第三组输入数据,第一次输入10.1 20.2,scanf返回值1输入失败,直接结束!此时x=10,y=292529680 ,第二次没有输入,scanf返回值2输入成功,结果b=0.1 c=20.20。不符合预期结果测试不通过!


    猜测思路如下:


    通过观察数据进内存空间存储的过程,发现②中,20.2 被拆分成20和0.2,y得到一个最高位为负数的20,0.2进入变量b的内存空间,接着第二次输入2.33 3.5 后,2.33进入了变量c的内存空间,剩下的3.5发现没有自己的存储空间了 ,游离在外~

    接着操作,发现③中,第一次输入数据10.1 20.2都没有满足scanf函数要求的数据输入类型,scanf返回值为1,输入失败!此时10.1被拆分成10和0.1,x=10 y=292529680 , 同时程序直接跳过第二个输入操作,0.1进入了变量b的内存空间 ,第一次输入的数据20.2进入了变量c的内存空间,变量y的数据猜测是游离在外的其它数据进入得到。


    以上皆为观察猜测,请老师解答验证猜测!或者提供相关方法我可以试验一下,太好奇了~

    2024-11-19 12:25:13
  • 中年猿叔 回复 提问者 慕九州9493288 #2

    输入的数据无法正确读取后,数据还在缓冲区内,第二个scanf会接着读取值。您的猜测没问题,可以在失败后用getchar把缓冲区的数据全部吃掉。需要用循环,一直吃到\n。

    2024-11-19 19:12:00
  • 提问者 慕九州9493288 回复 中年猿叔 #3

    问题描述:

    1、验证输入函数类型不对时,scanf返回值可能为2或者不为2的情况下,对数据混乱的处理

    2、验证变量不初始化,通过scanf的不正确输入数据类型,导致变量没有被初始化得到随机值的处理

    基于以上两种情况下的推论和操作流程,是否存在问题呢?如果存在请老师指正!


    相关截图:

    https://img1.sycdn.imooc.com/climg/673dc0e00982a98c07690598.jpg

    https://img1.sycdn.imooc.com/climg/673dc0e009246cac07690856.jpg



    思路:

    首先,按照最早版本运行结果分析。对于这组输入数据为:-10 -20.2  和 2.33 3.5 都能让scanf函数返回2,说明scan函数只管检查读取的数据是否满足最初要求的数据类型,不管结果数据是否是最初期待的目标结果;对于另一组输入数据为:10.1 20.2 和0 2,第一次执行scanf函数就返回1,读取失败后scanf不会再执行,并且缓冲区会有残余数据。

    因此,在每次调用scanf函数后,需要对缓冲区进行遍历清除数据。执行while(getchar()!= '\n')的操作,确保不会影响下一次输入数据读取的结果。运行结果查看代码截图红色方框①部分


    但是发现结果数据中,有一个y=1449041868的随机值,对于这个数值做了了解后发现,如果变量没有被赋值,那么该变量就会从当时的内存空间中获取一个不确定的随机值并且数值范围满足该内存空间定义的数据类型。这里是int类型,该数据极可能就是上一次占用该内存空间的残留数据。对于这个随机值并不是我希望的结果数据,我这里做了了解后,可以在变量定义时候,给一个自己知道的初始值,如截图代码部分,做了变量初始化赋值。

    因此,从运行截图红色方框②部分结果发现,本来在输入行数读取失败后,变量y没有获得对应的赋值,所以维持初始值0;


    综合上诉,首先,scanf函数读取数据后,应该进行缓冲区数据清除,确保下次输入数据不会因为上一次输入数据类型不对导致数据残留,影响下一次数据输入的结果。然后,变量可以初始化赋值,这样能规避没有赋值得到的随机值。


    以上验证和结论皆为根据老师给的方式和查询到的资料和验证后的数据结果产生,如果出入或者不当的地方,请老师指正!




















    2024-11-20 20:47:34
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师