go语言中的Scan()和Scanln()输入函数
Scan()输入函数
package mainimport "fmt"func main() {var a intvar b stringfor {fmt.Println("请输入一个整数和一个字符串(用空格分隔):")fmt.Scan(&a, &b) // 直接读取输入到变量中fmt.Println("整数:", a)fmt.Println("字符串:", b)}
}
正确的运行结果:

有问题的运行结果(第一种情况):

为什么当我第一次输入123然后点击Enter键,再输入456然后点击Enter键,控制台正确打印出了结果,但是当我第二次输入qwe然后点击Enter键后,直接在控制台输出了上一次的结果,并且是连续输出多个?
出现这种现象的原因是 fmt.Scan 函数在读取输入时发生了错误,并且没有处理错误的情况。当输入数据格式不符合预期时,例如输入 “qwe” 而不是一个整数和一个字符串,fmt.Scan 会返回一个错误,导致读取失败。由于错误没有被处理,程序会继续循环,并且变量 a 和 b 保留了上一次的值,从而导致上一次的结果被重复输出。
具体原因分析
1.第一次输入正确
:
- 你输入了 “123”,按下 Enter 键,然后再输入 “456”,按下 Enter。fmt.Scan 成功读取到整数 123 和字符串 “456”,并赋值给变量 a 和 b。
- 程序输出:
整数: 123
字符串: 456
2.第二次输入不符合预期
:
- 你输入了 “qwe” 并按下 Enter。此时,fmt.Scan 尝试读取一个整数和一个字符串,但输入的 “qwe” 无法解析为整数,因此 fmt.Scan 返回一个错误,并且 a 和 b 保留了之前的值 123 和 “456”。
- 因为程序没有检查并处理读取失败的情况,导致循环继续进行,重复输出上一次的结果。
3.连续输出
:
- 当 fmt.Scan 读取失败时,它不会从输入缓冲区中移除错误的输入(如 “qwe”),因此在下一次循环中再次读取时,仍然读取到 “qwe”,导致重复发生错误,输出同样的内容。
解决方法
需要在读取输入失败时进行错误处理,并清除输入缓冲区中的错误数据。可以使用 bufio.NewReader 来清空缓冲区,以确保下次读取时不会受之前错误输入的影响。
下面是修改后的代码示例:
package mainimport ("bufio""fmt""os"
)func main() {var a intvar b stringreader := bufio.NewReader(os.Stdin) // 创建一个 bufio.Reader 来清除缓冲区for {fmt.Println("请输入一个整数和一个字符串(用空格分隔):")_, err := fmt.Scan(&a, &b)if err != nil {fmt.Println("输入格式不正确,请重新输入")// 清除缓冲区中的剩余内容reader.ReadString('\n')continue}fmt.Println("整数:", a)fmt.Println("字符串:", b)}
}
修改说明
1.当输入格式不正确时,程序会提示 “输入格式不正确,请重新输入”,并使用 reader.ReadString(‘\n’) 来清除输入缓冲区中剩余的内容。
2.如果读取成功,则会输出当前的 a 和 b。
总结
出现连续输出的问题是因为 fmt.Scan 在输入格式错误时,未能正确处理错误并清除输入缓冲区。通过添加错误处理和清除输入缓冲区的操作,可以避免这种情况的发生。
当 fmt.Scan 读取失败时,既然它不会从输入缓冲区中移除错误的输入(如 “qwe”),因此在下一次循环中再次读取时,仍然读取到 “qwe”,导致重复发生错误,输出同样的内容。那为什么只是重复输出了3次,而不是一直重复输出下去呢?
出现这种现象的原因在于输入缓冲区的行为和 fmt.Scan 的工作原理。每次调用 fmt.Scan,它都会尝试读取输入缓冲区中的数据并解析为指定的格式(例如整数和字符串)。当输入格式不符合要求时,fmt.Scan 会返回一个错误,并且不会从缓冲区中移除无法解析的内容,因此导致错误的输入被多次重复读取。
但是,为什么这种重复只发生了3次而不是无限次呢?这可能是因为终端的输入缓冲区管理的行为和系统处理输入的方式。以下是可能的解释:
1.输入缓冲区的限制
:
- 操作系统或终端在处理输入缓冲区时,可能会对输入尝试的次数做出限制。如果连续多次读取失败,它可能会触发某种输入错误处理机制,导致程序的行为变化。
2.标准输入的阻塞行为
:
- 当使用 fmt.Scan 时,它会阻塞等待用户输入。虽然输入流中有残留数据(例如 “qwe”),但经过一定次数的错误读取后,可能输入流被清理,或者终端要求重新输入。因此,程序会暂停,等待用户输入新的数据。
3.自动错误处理机制
:
- 某些终端会自动进行错误数据的处理,或者根据缓冲区中的内容进行自动清空。当检测到多次重复输入失败时,可能会重置缓冲区的状态。
因此,尽管在程序逻辑上看起来应该无限循环,但因为终端或缓冲区管理的机制,导致这种重复输出的次数有限。
有问题的运行结果(第二种情况):


Scanln()输入函数
package mainimport "fmt"func main() {var a intvar b stringfor {fmt.Println("请输入一个整数和一个字符串(用空格分隔,并按回车结束):")fmt.Scanln(&a, &b) // 直接读取输入到变量中fmt.Println("整数:", a)fmt.Println("字符串:", b)}
}
正确的结果:

错误的结果:


相关文章:
go语言中的Scan()和Scanln()输入函数
Scan()输入函数 package mainimport "fmt"func main() {var a intvar b stringfor {fmt.Println("请输入一个整数和一个字符串(用空格分隔):")fmt.Scan(&a, &b) // 直接读取输入到变量中fmt.Println("整数…...
UML外卖系统报告(包含具体需求分析)
1 系统背景 随着互联网技术的快速发展,外卖订餐服务逐渐成为人们生活中的一部分。传统的电话订餐方式面临诸多不便和限制,而基于互联网的外卖订餐系统则提供了更加便捷、快速和高效的订餐服务。这种系统通过将餐厅、顾客和配送人员连接起来,…...
net Core Data Protection 数据保护 加密 编码 哈希 FromServices
》》》 通过构造函数 获取服务 [Route("api/[controller]")][ApiController]public class DataProtectController : ControllerBase{[HttpGet]public string Info(){return "zen";}// [FromServices] 自动获取 builder.Services.AddDataProtection()注…...
4K手机壁纸之动漫系列
因为平台限制了图片大小,大家将就看吧,原图找me...
关于eclipse的workspace
如果项目很多,为了方便管理,最好不要是使用working set 对项目进行分组。一个workspace加载项目过多,即使进行分组,有些操作也很对所有项目生效。为了避免卡顿,建议直接使用workspace分组管理,而不是workin…...
Vue引入高德地图自定义信息窗体绑定点击事件无效解决方案
你们好,我是金金金。 场景 笔者用的Vue3,引入了高德地图,version为2.0,场景如下: 在地图上根据经纬度度打点标记了一个位置,然后点击点标记弹出自定义信息窗体,右上角关闭按钮则是绑定了关闭自定…...
私域朋友圈运营
今天必须给大家分享一份超棒的朋友圈运营思维导图 有了它,你可以逐步打造属于自己的精彩朋友圈🎉。无论是想分享生活点滴💧,还是展示个人魅力✨,又或者推广自己的业务📈,这份思维导图都能给你指…...
【Vue】word / excel / ppt / pdf / 视频(mp4,mov) 预览
文件预览 Vue3一. word二. excel三. ppt四. pdf4.1 vue-pdf-embed4.2 iframe 五. 视频六:扩展——kkFileView Vue3 一. word 安装:npm install docx-preview父页面 <template><div><DocPreviewv-if"filePath.includes(docx)"…...
如何加密电脑磁盘?电脑本地磁盘加密方法介绍
随着信息技术的不断发展,电脑磁盘加密已经成为保护个人隐私和数据安全的重要手段。本文将介绍几种常见的电脑本地磁盘加密方法,帮助用户保护自己的数据安全。 文件夹只读加密专家 文件夹只读加密专家不仅可以加密电脑中的文件夹,还可以加密保…...
1688、淘宝、京东搜索商品聚合接口技术实现与代码示例
在当今电商领域,多平台商品搜索已成为用户获取多样化商品信息的重要途径。为了满足用户对1688、淘宝、京东等主流电商平台商品搜索的需求,开发一个跨平台的商品搜索聚合接口显得尤为重要。本文将详细介绍如何实现这一接口,包括接口设计、平台…...
视频智能分析平台LiteAIServer烟火识别软件引领烟火检测与识别的智能新纪元
随着人工智能技术的飞速进步,视频智能分析技术正以前所未有的深度和广度渗透至安全防护、环境监测等多个关键领域。其中,烟火识别软件LiteAIServer凭借其卓越的烟火检测与识别算法,成为了业界瞩目的焦点。 一、烟火检测:守护公共安…...
VUE前端按钮添加遮罩层
需求 当前需求是由于部分按钮操作的执行时间过长,因此添加遮罩层,防止用户误操作。 实现方式 在请求接口时创建遮罩层,并将遮罩层保存为全局唯一,请求成功或失败时,关闭遮罩层即可,切记,请求…...
列出机器学习方向的创新点
以下是机器学习方向的一些创新点: 一、算法创新 新型神经网络架构 图神经网络(Graph Neural Networks,GNNs) 传统的神经网络主要处理欧几里得空间的数据,如图像(网格结构)和序列(线性结构)。然而,现实世界中有许多数据具有图结构,如社交网络、分子结构等。图神经网…...
ffmpeg视频滤镜:腐蚀滤镜
滤镜简述 erosion 官网链接> FFmpeg Filters Documentation 这个滤镜会在视频上应用腐蚀操作,腐蚀操作是形态学中一种操作,接触过opencv的同学应该很熟悉。滤镜主要有如下作用: 去除噪声:腐蚀可以帮助去除图像中的小颗粒噪…...
react18中在列表项中如何使用useRef来获取每项的dom对象
在react中获取dom节点都知道用ref,但是在一个列表循环中,这样做是行不通的,需要做进一步的数据处理。 实现效果 需求:点击每张图片,当前图片出现在可视区域。 代码实现 .box{border: 1px solid #000;list-style: …...
java前后端项目问题总结
java前后端项目问题总结 1、字段 数据库 数据库在建表时除了需要的字段还有六个必要字段 主键 id 逻辑删 is_delete 创建人create_by 创建时间create_time 修改人 update_by 修改时间 update_time 这些字段在实体类中写法 //Date注解会自动生成一个无参构造…...
Qt设置浏览器为父窗口,嵌入播放器窗口
本项目旨在利用Qt框架实现一个创新的用户界面,允许将Qt窗口作为子窗口嵌入到浏览器中,增强用户体验并实现更丰富的交互功能。随着Web技术的不断发展,越来越多的应用程序希望结合桌面应用程序和Web浏览器的优势,以便更好地满足用户…...
运行Vue项目报错ChunkLoadError: Loading chunk 0 failed.
今天在搭建一个前后端分离的项目,前端报了一个问题,由于我不太了解前端,找了好多办法都没解决。因为是维护老项目,拿到源码大概率是没有问题的(我也是赌的……只能按照没问题来查了),最后耐下心…...
腾讯云上基于 Apache Pulsar 的大规模生产实践
导语 Pulsar Meetup 2024 北京站已经成功落下帷幕。在本次盛会中,腾讯云的高级工程师韩明泽和王震江为与会者带来了精彩的演讲。他们围绕多网接入、集群迁移以及高可用最佳实践这三大核心议题,深入剖析了《腾讯云上基于 Apache Pulsar 的大规模生产实践…...
Linux网络:序列化与反序列化
Linux网络:序列化与反序列化 序列化与反序列化jsonjsoncppValue对象序列化反序列化WriterReader 序列化与反序列化 在网络通信中,最重要的就是通过接口,将数据通过网络发送给另一台主机。那么另一台主机收到数据后,就可以对数据进…...
RMBG-2.0从零开始:Ubuntu 22.04 + CUDA 12.1完整环境搭建
RMBG-2.0从零开始:Ubuntu 22.04 CUDA 12.1完整环境搭建 想体验一键抠图,把照片背景变得干干净净?今天,我们就来手把手教你,在Ubuntu 22.04系统上,从零开始搭建一个基于RMBG-2.0模型的智能抠图环境。RMBG-…...
从开发到SRE:PyTorch 3.0静态图生产部署必须签署的4份SLA协议,及对应可观测性埋点清单
第一章:PyTorch 3.0静态图分布式训练生产部署全景概览PyTorch 3.0 引入原生静态图编译能力(TorchDynamo Inductor 后端深度集成),结合 torch.distributed 的增强调度器与弹性容错机制,构建了面向大规模集群的端到端生…...
网站纠错页面对 SEO 有什么作用_网站图片和视频优化对 SEO 有什么技巧
网站纠错页面对 SEO 有什么作用 在网站管理和搜索引擎优化(SEO)方面,纠错页面的作用常常被忽视。网站纠错页面实际上对 SEO 有着重要的影响。当用户访问一个网站时,如果遇到 404 错误(页面未找到)或其他错…...
linux sed/awk命令检索区间日志的问题
开发时如果需要检索一段时间内或者某个批量执行期间的所有日志,也就是区间日志时,手动检索会有一些问题:如要查询一段时间前的日志(比如归档日志),需要一页一页翻,费时且费眼睛使用grep筛选日志…...
气动元器件选型(工业自动化场景实战指南)
1. 气动技术基础与工业自动化适配性 气动技术作为工业自动化领域的核心驱动方式之一,其本质是通过压缩空气实现能量传递。想象一下,就像我们用吸管吹动纸团一样简单直接——空压机将电动机的旋转动能转化为气压能,再通过各类阀门控制气流方向…...
MCP协议实战:用npx免安装部署文件系统服务的完整指南
MCP协议实战:用npx免安装部署文件系统服务的完整指南 在当今快速迭代的开发环境中,如何高效部署和管理文件系统服务成为许多开发者面临的挑战。传统方式往往需要全局安装各种工具包,不仅占用系统资源,还可能引发版本冲突。本文将带…...
日志配置陷阱:Telegraf Windows版本兼容性问题深度解析
日志配置陷阱:Telegraf Windows版本兼容性问题深度解析 Windows系统管理员常面临日志采集配置升级后服务无法启动的困境。Telegraf作为InfluxData开源的指标收集代理(Agent),其Windows版本在日志配置变更时可能引发兼容性问题。本…...
Diablo Edit2实战解决方案:从存档修复到角色定制的完整指南
Diablo Edit2实战解决方案:从存档修复到角色定制的完整指南 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 在暗黑破坏神II的冒险旅程中,每位玩家都可能遭遇存档损坏、属性…...
PyTorch 2.8镜像惊艳案例:碳排放数据→双碳目标达成路径视频推演
PyTorch 2.8镜像惊艳案例:碳排放数据→双碳目标达成路径视频推演 1. 效果惊艳开场 想象一下,只需输入简单的碳排放数据,就能自动生成一段专业级的双碳目标达成路径推演视频。这不是科幻场景,而是我们基于PyTorch 2.8镜像实现的真…...
【仅限头部车企工控厂商内部流通】C++27静态反射安全合规包:覆盖MISRA C++:2023 Annex A.12及AUTOSAR C++14兼容性桥接层
第一章:C27 静态反射工业应用案例C27 将正式引入标准化的静态反射(Static Reflection)核心特性,基于 std::reflexpr 和反射元对象模型(ROM),使编译期类型结构可被直接查询与遍历,无需…...
