scanf从缓冲区读值、检查缓冲区与读取失败

先看一段代码:代码①

#include <Windows.h>
int main()
{
int n = 0;
while (scanf( "%d", &n) != EOF)       //        如果输入a死循环
{
printf( "b\n");
//getchar();
Sleep(1000);
}
return 0;
}
此程序的输出结果是        输出b       休眠1s        (自动读取a)        输出b        休眠1s
反复循环。
分析:
输入a,但是%d读取的是10进制数字,所以认为读取的类型不符合,
此时scanf并不会跳过a,而是把a重新放在缓冲区,下一次scanf读取的时候,还是会读取a!
注意的是,并没有读取失败,只不过是在反复读取a。如果读取失败,那将无法进入循环!

 

但注意的是,不同于以下程序:代码②

int main()
{
    int n = 'A';
    printf("%d", n);        
    return 0;
}

这段程序不需要读取,只需要将A的ASC II码值,用10进制的形式打印出来!
 

再看代码③

int main()
{
int n = 0;
int m = 0;
scanf( "%d %d", &n, &m);    //输入A 8
printf( "%d %d", n, m);       //打印 0 0        
return 0;
}
输入A 8,此时scanf的第一个%d读取数据时,由于类型不符,所以A会停留在缓冲区,留给下一个%d读取,因此才会给  n  m赋值失败。(赋值失败不是读取失败,读取失败会返回EOF,接着往下读就明白了)
再看代码④
int main()
{
    int n = 0;
    int m = 0;
   int ret =  scanf("%d %d", &n, &m);    //输入A  8
   printf("%d",ret);       //打印 0
   return 0;
}
分析:此时ret会scanf的返回值,但是由于给n m读取数值都没有读取进去,所以ret为0。
再看代码⑤
int main()
{
    int n = 0;
    int m = 0;
   int ret =  scanf("%d %d", &n, &m);    //输入Ctrl + z     8
   printf("%d",ret);       //打印 -1
   return 0;
}
分析:Ctrl + z会被认为成EOF,当scanf读取到EOF的时候,会认为读取失败,此时返回值为EOF(即-1)

再看代码⑥

int main()
{
    int n = 0;
    int m = 0;
   int ret =  scanf("%d %d", &n, &m);    //输入8      Ctrl + z     
   printf("%d",ret);       //打印 1
   return 0;
}

解析:

此时第一个%d成功读取到数字8,会读取成功,再读取到EOF,会被认为读取失败。

scanf的返回值是成功读取的元素个数,为 1 

因为只有n是成功被读取的,m并没有被成功读入(m还是初始化的值)。

所以ret 为 1

总结:当死循环、莫名读取的时候,学会使用Sleep来检查缓冲区!!!

2.当读取的类型不符合时,不会跳过此元素

3.EOF会读取失败

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

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

相关文章

透明多级分流系统(用户端缓存和负载均衡)

部件考虑 有些设备位于客户端或者网络边缘&#xff0c;能够迅速响应用户请求&#xff0c;避免给cpu和数据库带来压力&#xff0c;比如&#xff0c;本地缓存&#xff0c;内容分发网络&#xff0c;反向代理等。 有些设备处理能力能够线性扩展&#xff0c;易于伸缩&#xff0c;应…

探索程序员职业迷宫:选择适合自己的职业赛道

作为现代社会中备受青睐的职业之一&#xff0c;程序员的职业赛道就如同一座错综复杂的迷宫&#xff0c;充满了挑战与机遇。在这个迷宫中&#xff0c;有着前端的绚丽花园、后端的神秘洞穴以及数据科学的深邃密室&#xff0c;每一条路径都蕴藏着无限可能和发展空间。而如何选择适…

代码随想录Day22 | Leetcode39 组合总和、Leetcode40 数组总和II | Leetcode131 分割回文串

上题 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 40. 组合总和 II - 力扣&#xff08;LeetCode&#xff09; 131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 第一题 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找…

ChatGPT聊天机器人数据隐私和安全问题

ChatGPT是否安全使用&#xff1f; 是的&#xff0c;ChatGPT是安全的&#xff0c;因为它无法对你或你的计算机造成任何直接损害。由于网页浏览器和智能手机操作系统都使用了沙箱技术&#xff0c;因此ChatGPT无法访问你设备的其余部分。换句话说&#xff0c;当你使用ChatGPT应用程…

node.js中path.join() 和 path.resolve()

《Node.js》path.resolve与path.join的区别与作用_js path.resolve-CSDN博客

Sentinel 面试题及答案整理,最新面试题

Sentinel的流量控制规则有哪些&#xff0c;各自的作用是什么&#xff1f; Sentinel的流量控制规则主要包括以下几种&#xff1a; 1、QPS&#xff08;每秒查询量&#xff09;限流&#xff1a; 限制资源每秒的请求次数&#xff0c;适用于控制高频访问。 2、线程数限流&#xf…

【异常处理】Mybatis报错 source is null for getProperty(null, “length“)

发现问题 <select id"listArticle" resultType"top.ambtwill.blog.dao.pojo.Article">select * from ms_article<where>11<if test"categoryId ! null">and category_id#{categoryId}</if><if test"tagId ! nul…

MacOS安装反编译工具JD-GUI 版本需要1.8+

Java Decompiler http://java-decompiler.github.io/ 将下载下来的 jd-gui-osx-1.6.6.tar 解压&#xff0c;然后将 JD-GUI.app 文件拷贝到 Applications 应用程序目录里面 1.显示包内容 2.找到Contents/MacOS/universalJavaApplicationStub.sh 3.修改sh文件 内容修改为下面…

微服务之商城系统

一、商城系统建立之前的一些配置 1、nacos Nacos是一个功能丰富的开源平台&#xff0c;用于配置管理、服务发现和注册、健康检查等&#xff0c;帮助构建和管理分布式系统。 在linux上安装nacos容器的命令&#xff1a; docker run --name nacos-standalone -e MODEstandalone …

07 - 镜像管理之:镜像优化

1 为什么要做镜像优化? 1&#xff09;随着我们对docker镜像的持续使用&#xff0c;在此过程中如果不加以注意并且优化&#xff0c;镜像的体积会越来越大&#xff0c;很多时候我们在使用docker部署应用时&#xff0c;会发现镜像的体积可能都会在1G以上。 2&#xff09;镜像体积…

08 视图

视图 视图概念 视图是存储的查询语句,当调用的时候,产生结果集,视图充当的是虚拟表的角色。其实视图可以理解为一个表或多个表中导出来的表&#xff0c;作用和真实表一样&#xff0c;包含一系列带有行和列的数据 视图中&#xff0c;用户可以使用SELECT语句查询数据&#xff0…

Fabric V2.5 通用溯源系统——应用前端部分设计及简易二次开发

本节对Fabric V2.5 通用溯源系统的前端部分做一个简单的介绍。包括目录结构、文件作用简述、用户注册登录实现、农产品信息上链溯源实现的介绍。同时提供了简易二次开发的教程(面向需要在短时间内二次开发),将本项目修改为商品溯源项目,仅修改前端部分。本节内容需要订阅《…

Python报错ModuleNotFoundError: No module named ‘numpy‘

原因&#xff1a;缺少“numpy” 进入python安装路径&#xff0c;script路径内 在路径下启动终端 01.更新numpy python -m pip install --upgrade pip 02.安装 pip install numpy 03.运行python python 04.导入包 from numpy import * 问题已解决。

凌鲨客户端架构

客户端架构 客户端使用了tauri作为主框架&#xff0c;通过rust和内置应用(sidecar)为前端界面提供额外能力。 内置应用(sidecar) 应用 相关项目 说明 devc 开发环境容器工具 gitspy 本地git仓库管理工具 grpcutil grpc调用工具 mongo 通讯协议 mongo协议转发工具 …

MATLAB知识点:循环语句的经典练习题:二分搜索

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自​第4章&#xff1a;MATLAB程序流程控制 这个例题我们…

SSD LDPC纠错算法的重要性

固态硬盘&#xff08;Solid State Drives, SSD&#xff09;作为计算机行业中最具革命性的技术之一&#xff0c;凭借其更快的读写速度、增强的耐用性和能效&#xff0c;已经成为大多数用户的首选存储方案。然而&#xff0c;如同任何其他技术一样&#xff0c;SSD也面临自身的挑战…

探索云原生世界:Serverless 技术的崛起与应用

在云原生架构的浪潮中&#xff0c;Serverless 技术正逐渐崭露头角&#xff0c;成为开发者们极具吸引力的选择。Serverless 的出现颠覆了传统的服务器管理模式&#xff0c;为应用开发带来了全新的可能性。 Serverless 架构是一种无需管理服务器的新型架构&#xff0c;它允许开发…

RabbitMQ 基本介绍

RabbitMQ 基本介绍 消息模型 所有 MQ 产品从模型抽象上来说都是一样的过程&#xff1a; 消费者&#xff08;consumer&#xff09;订阅某个队列。生产者&#xff08;producer&#xff09;创建消息&#xff0c;然后发布到队列&#xff08;queue&#xff09;中&#xff0c;最后…

大模型快速实现python3+html内容在线渲染

需求&#xff1a; 有一份数据需要通过前端在线展示给用户&#xff0c;不需要复杂的样式交互&#xff0c;后端服务是基于Python3实现的API接口&#xff0c;对前端技术不是很了解&#xff0c;需要快速实现该需求。类似样式即可&#xff1a; 思路&#xff1a; 如果页面不复杂&am…

【QT】对比C#的ArrayList,qt中也有自己的通用容器(若有误,恳请直接指出)

在Qt中&#xff0c;可以使用QList或QVariantList来代替C#中的ArrayList。QList是Qt中的一个通用容器类&#xff0c;类似于C#中的List<T>&#xff0c;但它不是类型安全的。另一方面&#xff0c;QVariantList是QList<QVariant>的别名&#xff0c;用于存储可以包含任何…