zoukankan      html  css  js  c++  java
  • 关于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 语句就不会运行。

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

  • 相关阅读:
    vue项目搭建步骤
    文件的操作总结
    WPF 使用皮肤影响按钮自定义
    WPF中:未找到可以 register Name“XXX”的 NameScope
    WPF Label或者其他控件(以Content显示内容的)单个下划线不显示的问题。
    wpf 中GridControl后面总是多一空白列
    WPF设置控件层次问题(最顶层,最底层)
    WPF中设置TreeView的高度随着窗口改变
    C# 检测文件是否被其他进程占用
    XML文件的操作
  • 原文地址:https://www.cnblogs.com/confusion/p/9097010.html
Copyright © 2011-2022 走看看