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 序列化与反序列化 在网络通信中,最重要的就是通过接口,将数据通过网络发送给另一台主机。那么另一台主机收到数据后,就可以对数据进…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
