关于用scanf(“%d“,)时非法字符输入导致的死循环的原因及解决方法

现象描述

题目要求输入一个整数n(0<n<20),需要考虑非法字符输入的情况。若输入非法字符或者不在合法区间,则重新输入。于是我们很自然的打出了如下代码:

int a;
while(1){scanf("%d",&a);if(a>0&&a<20) break;
}
  • 我们运行一下后就会发现,一旦我们输入了一个非法字符(如a,aaa,asdas),那么我们接下来输什么都没有用,程序陷入了死循环。

原理分析:

  • 经多方查找资料得知,scanf有缓存区,当输入非法字符(要求的类型与输入的类型不符合),scanf会直接跳过,即该输入不会被接收也不会被清除,而会被存放在scanf的缓存区,当下次调用scanf函数时,会直接从缓存区读取非法字符,造成死循环。

解决思路:

  • 清除滞留在scanf缓存区的数据,使下一次循环时scanf可以正常的读取用户输入。

解决方法

  1. 用getchar把缓冲区清空。
//法一:
int a;
while(1){scanf("%d",&a);if(a>0&&a<20) break;while(getchar()!='\n'); //清空缓存区,直到换行输入
} 
//法二:
int a,m=0;
do{m=scanf("%d",&a);//m是scanf读入的数的个数 if(m!=1)//如果读入了一个数 即 输入了一个s整数 while(getchar()!='\n'); //清空缓存区,直到换行输入
}while(m!=1||a<=0||a>=20);
  1. 直接使用缓冲区清除函数fflush(stdin); //stdin代表标准输入
int a;
while(1){fflush(stdin);//在每次输入前清空缓冲区scanf("%d",&a);if(a>0&&a<20) break;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/73435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NSV60600MZ4T1G 双极型晶体管(BJT)学习总结

双极型晶体管的起源: 双极型晶体管是在1947年发明的&#xff0c;第一个晶体管是将两条具有尖锐端点的金属线与锗衬底(germanium substrate)形成点接触(point contact)&#xff0c;以今天的水准来看&#xff0c;此第一个晶体管虽非常简陋但它却改变了整个电子工业及人类的生活方…

关于一次两段式提交和数据库恢复数据我的一些想法

binlog是服务层的功能&#xff0c;而redolog是innodb引擎的功能&#xff0c;binlog主要用于主从复制&#xff0c;redolog主要用做数据的恢复&#xff0c;我们必须保证binlog和redolog日志数据的一致性。恢复数据时也必须遵守此一致性。 1.如果只写一次redolog会出现什么问题&a…

行测图形推理规律(一)元素组成

题库&#xff1a;粉笔网题库 (fenbi.com) 不知道和测评的行测题库是不是一样的&#xff0c;但是总结的规律应该是一样的。 规律并不唯一&#xff0c;题库的答案也只是参考答案&#xff0c;切勿当杠精&#xff0c;你觉得你的规律更合适就别管。本人所归纳的规律仅代表本人想法…

开源知识库平台Raneto

什么是 Raneto &#xff1f; Raneto 是一个开源知识库平台&#xff0c;它使用静态 Markdown 文件来支持您的知识库。 官方提供了 doc & demo 网站&#xff0c;即是帮助文档&#xff0c;也是个 demo&#xff0c;地址&#xff1a;https://docs.raneto.com 准备 项目使用con…

Android之 Canvas绘制

一 Canvas介绍 1.1 Canvas 是绘制图形的重要类之一&#xff0c;它可以在 View 或 SurfaceView 上绘制各种图形和文本. 1.2 要创建 Canvas&#xff0c;首先需要有一个 View 或 SurfaceView 对象&#xff0c;在 View 或 SurfaceView 的绘制方法中&#xff0c;可以通过 Canvas 的…

Git的一些常用概念与操作方法分享

Git是一个版本控制系统&#xff0c;它可以记录代码的变化历史并允许多个开发者同时对同一代码库进行开发。以下是Git的基本概念和使用方式&#xff1a; 仓库&#xff08;Repository&#xff09;- 保存代码的地方。Git仓库包含了所有的版本历史记录、代码以及其他相关文件。 分…

【元宇宙】临界质量,元宇宙的关键要素

考虑到电气化和移动技术的普及过程&#xff0c;我们可以自信地说&#xff0c;元宇宙不会突然到来。同时&#xff0c;也不会有明确的“元宇宙之前”( beforeMetaverse &#xff09;和“元宇宙之后”( afterMetaverse &#xff09;阶段一它们只是对应着生活发生改变的历史时期。一…

使用ADB命令查询Android设备的安卓版本信息

确保你已经安装了ADB并将其添加到系统的路径中。 连接你的Android设备到计算机&#xff0c;并确保启用了开发者选项和USB调试模式。你可以在设备的设置中找到这些选项。 打开终端&#xff08;命令提示符或终端窗口&#xff09;。 运行以下ADB命令来获取Android设备的安卓版本…

华为云云耀云服务器L实例评测|部署spring项目端口开放问题的解决 服务器项目环境搭建MySQL,Redis,Minio...指南

目录 引出书接上回&#xff0c;部署spring项目&#xff0c;端口访问失败最后排查结果反馈 尝试的几种解决方案【未成功】1.指定tomcat启动ipv4端口2.添加开放端口规则保存规则防火墙相关命令记录 最终成功解决【成功&#xff01;】用firewall成功了问题来了&#xff0c;如果这里…

Linux系统离线安装RabbitMQ

安装rabbitmq 1、下载安装包 首先进入官网进行安装包的下载&#xff0c;在下载时一定要注意erlong版本和rabbitmq-server版本匹配 rabbitmq版本对应关系&#xff1a;传送门 Erlong下载地址:传送门 rabbitmq-server下载地址:传送门 socat 不同版本 centos7:传送门 cent…

OJ练习第166题——课程表(拓扑排序问题)

课程表 力扣链接&#xff1a;207. 课程表 题目描述 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表…

2023数学建模国赛B题完整论文来啦!(含一二问求解代码及三四问仿真模拟代码)

大家好呀&#xff0c;从昨天发布赛题一直到现在&#xff0c;总算完成了全国大学生数学建模竞赛B题完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 说实话团队通宵一直到现在做…

MyBatis的缓存

文章目录 前言一、MyBatis的缓存1.MyBatis的一级缓存2.MyBatis的二级缓存3.二级缓存的相关配置4.MyBatis缓存查询的顺序5.整合第三方缓存EHCache&#xff08;了解&#xff09;添加依赖各个jar包的功能创建EHCache的配置文件ehcache.xml设置二级缓存的类型加入logback日志EHCach…

CG MAGIC进行实体渲染后!分析渲染器CR和VR的区别之处!

新手小白来说&#xff0c;如何选择渲染器&#xff0c;都会提出疑问&#xff1f; 渲染效果图究竟用CR渲染器还是VR渲染器呢&#xff1f; 今天&#xff0c;CG MAGIC小编通过一个真实的项目场景&#xff0c;实例渲染之后&#xff0c;CR渲染器和VR渲染器区别有哪几点&#xff1f; 1…

flatten-maven-plugin使用

这篇文章主要介绍了flatten-maven-plugin使用&#xff0c;本文通过示例代码给大家介绍的非常详细&#xff0c;对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 − 目录 一、简介 1.1 作用1.2 goal介绍二、使用总结 一、简介 1.1 作用 将pom工程父子pom的版…

每天几道面试题(第一天)

目录 第一幕 、第一场&#xff09;某大厦楼下大门前第二场&#xff09;电梯中第三场&#xff09;公司前台 友情提醒 背面试题很枯燥&#xff0c;加入一些戏剧场景故事人物来加深记忆。PS:点击文章目录可直接跳转到文章指定位置。 第一幕 、 第一场&#xff09;某大厦楼下大门…

Eviews用向量自回归模型VAR实证分析公路交通通车里程与经济发展GDP协整关系时间序列数据和脉冲响应可视化...

全文下载链接&#xff1a;http://tecdat.cn/?p27784 河源市是国务院1988年1月7日批准设立的地级市&#xff0c;为了深入研究河源市公路交通与经济发展的关系&#xff0c;本文选取了1988&#xff0d;2014年河源市建市以来24年的地区生产总值&#xff08;GDP&#xff09;和公路通…

Java jvm 内存溢出分析

1.如何分析jvm内存溢出呢 我们经常用visualVm监控Jvm的内存&#xff0c;cpu&#xff0c;线程的使用情况&#xff0c;通常可以根据内存不断增长来判断内存是否存在不释放。但是我们不可能时时盯着去看&#xff0c;这里涉及jvm堆内存配置&#xff0c;堆内存参数配置和调优会在其…

rk3399 android以太网和wifi共存

Android 9 1.修改 frameworks/base/core/java/android/net/NetworkFactory.java evalRequest 方法 注释两行 private void evalRequest(NetworkRequestInfo n) {if (VDBG) log("evalRequest");if (n.requested false && n.score < mScore &&n…

uniapp中UView中 u-form表单在v-for循环下如何进行表单校验

1、数据data格式 注&#xff1a;rule绑定的tableFromRule中要和表单tableFrom下面放置一个同名数组&#xff0c;确保u-form能找到 tableFrom: {tableData: [//数据详情列表]},tableFromRule: {//校验tableData: [//数据详情列表]},formRules:{localation:[{required: true,mes…