• 关于scanf()读取与返回值和回车键的问题


    今天老师检查的时候说如果一个链表为空(简单的说就是while(scanf())一开始没输入数字就按回车的话会进入死循环)的情况,

    我当时有点懵,因为文档里强调为空的情况。还好老师叫我自己现场实现一下,

    当时想了两个方案:

       *一是用getchar()接受第一个回车(我设定的输入回车结束),如果用户第一个键盘输入就是回车,它能工作的很好。

     

    但是当第一个键盘输入不是一个回车的时候,就遇到一个问题:getchar()会吃掉第一个数字

    的一部分,之所以说一部分是因为经过我测试发现:

     

    Getchar()能返回的值最大为57,这显然是不合理的。

    于是我想到了第二个方法:

       *先用getchar读取,如果getchar读取的不是回车,就将它重新放回缓冲区,再又scanf()函数来

    读取。但是这个方案有点麻烦,还要区查资料,搞明白怎么将读取的数据重新放回缓冲区。好的

    是在我采取这个方案之前我想到了更好的办法:

    第三个办法:

       *将结尾判断改一下直接上图,待会解释原理

     

    我对这个函数做了两处改动,第一个和第三个箭头。

    第一个改动是把Enter键改成了q键,因为回车会刷新缓冲区,而scanf()函数一直在等待一个数字,

    所以在一开始狂按回车是没用的,解决方案就是把回车换成一个字符(q可以代表quit,所以用q,

    其他字符也可以)。程序遇到用户输入的q时,图片中函数里的u等于0,所以退出whlie语句。

    第二个改动是在两个while语句之间加了一个getchar(),他的作用是:当用户输入q时,第一个while

    里面的scanf函数是没有读取到这个q的,,如果没有这个getchar,那么用户输入的q将由第二个

    scanf函数来读取。这样第二个while 语句就不会运行。

    这样,程序就能满足输入为空表的情况了。

  • 相关阅读:
    Extjs 4.0 Tab页
    dojo省份地市级联之省份Dao实现类(五)
    dojo省份地市级联之地市Dao接口类(四)
    dojo省份地市级联之省份Dao接口类(三)
    dojo省份地市级联之地市封装类(二)
    dojo之dojox/data/CsvStore初始化
    dojo拼接成CSV格式字符串
    OCP-1Z0-053-200题-200题-61
    OCP-1Z0-053-200题-201题-61
    OCP-1Z0-053-200题-202题-403
  • 原文地址:https://www.cnblogs.com/confusion/p/9097010.html
Copyright © 2020-2023  润新知