当前位置: 首页 > news >正文

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 五. 视频六&#xff1a;扩展——kkFileView Vue3 一. word 安装&#xff1a;npm install docx-preview父页面 <template><div><DocPreviewv-if"filePath.includes(docx)"…...

如何加密电脑磁盘?电脑本地磁盘加密方法介绍

随着信息技术的不断发展&#xff0c;电脑磁盘加密已经成为保护个人隐私和数据安全的重要手段。本文将介绍几种常见的电脑本地磁盘加密方法&#xff0c;帮助用户保护自己的数据安全。 文件夹只读加密专家 文件夹只读加密专家不仅可以加密电脑中的文件夹&#xff0c;还可以加密保…...

1688、淘宝、京东搜索商品聚合接口技术实现与代码示例

在当今电商领域&#xff0c;多平台商品搜索已成为用户获取多样化商品信息的重要途径。为了满足用户对1688、淘宝、京东等主流电商平台商品搜索的需求&#xff0c;开发一个跨平台的商品搜索聚合接口显得尤为重要。本文将详细介绍如何实现这一接口&#xff0c;包括接口设计、平台…...

视频智能分析平台LiteAIServer烟火识别软件引领烟火检测与识别的智能新纪元

随着人工智能技术的飞速进步&#xff0c;视频智能分析技术正以前所未有的深度和广度渗透至安全防护、环境监测等多个关键领域。其中&#xff0c;烟火识别软件LiteAIServer凭借其卓越的烟火检测与识别算法&#xff0c;成为了业界瞩目的焦点。 一、烟火检测&#xff1a;守护公共安…...

VUE前端按钮添加遮罩层

需求 当前需求是由于部分按钮操作的执行时间过长&#xff0c;因此添加遮罩层&#xff0c;防止用户误操作。 实现方式 在请求接口时创建遮罩层&#xff0c;并将遮罩层保存为全局唯一&#xff0c;请求成功或失败时&#xff0c;关闭遮罩层即可&#xff0c;切记&#xff0c;请求…...

列出机器学习方向的创新点

以下是机器学习方向的一些创新点: 一、算法创新 新型神经网络架构 图神经网络(Graph Neural Networks,GNNs) 传统的神经网络主要处理欧几里得空间的数据,如图像(网格结构)和序列(线性结构)。然而,现实世界中有许多数据具有图结构,如社交网络、分子结构等。图神经网…...

ffmpeg视频滤镜:腐蚀滤镜

滤镜简述 erosion 官网链接> FFmpeg Filters Documentation 这个滤镜会在视频上应用腐蚀操作&#xff0c;腐蚀操作是形态学中一种操作&#xff0c;接触过opencv的同学应该很熟悉。滤镜主要有如下作用&#xff1a; 去除噪声&#xff1a;腐蚀可以帮助去除图像中的小颗粒噪…...

react18中在列表项中如何使用useRef来获取每项的dom对象

在react中获取dom节点都知道用ref&#xff0c;但是在一个列表循环中&#xff0c;这样做是行不通的&#xff0c;需要做进一步的数据处理。 实现效果 需求&#xff1a;点击每张图片&#xff0c;当前图片出现在可视区域。 代码实现 .box{border: 1px solid #000;list-style: …...

java前后端项目问题总结

java前后端项目问题总结 1、字段 数据库 数据库在建表时除了需要的字段还有六个必要字段 主键 id 逻辑删 is_delete 创建人create_by 创建时间create_time 修改人 update_by 修改时间 update_time 这些字段在实体类中写法 //Date注解会自动生成一个无参构造&#xf…...

Qt设置浏览器为父窗口,嵌入播放器窗口

本项目旨在利用Qt框架实现一个创新的用户界面&#xff0c;允许将Qt窗口作为子窗口嵌入到浏览器中&#xff0c;增强用户体验并实现更丰富的交互功能。随着Web技术的不断发展&#xff0c;越来越多的应用程序希望结合桌面应用程序和Web浏览器的优势&#xff0c;以便更好地满足用户…...

运行Vue项目报错ChunkLoadError: Loading chunk 0 failed.

今天在搭建一个前后端分离的项目&#xff0c;前端报了一个问题&#xff0c;由于我不太了解前端&#xff0c;找了好多办法都没解决。因为是维护老项目&#xff0c;拿到源码大概率是没有问题的&#xff08;我也是赌的……只能按照没问题来查了&#xff09;&#xff0c;最后耐下心…...

腾讯云上基于 Apache Pulsar 的大规模生产实践

导语 Pulsar Meetup 2024 北京站已经成功落下帷幕。在本次盛会中&#xff0c;腾讯云的高级工程师韩明泽和王震江为与会者带来了精彩的演讲。他们围绕多网接入、集群迁移以及高可用最佳实践这三大核心议题&#xff0c;深入剖析了《腾讯云上基于 Apache Pulsar 的大规模生产实践…...

Linux网络:序列化与反序列化

Linux网络&#xff1a;序列化与反序列化 序列化与反序列化jsonjsoncppValue对象序列化反序列化WriterReader 序列化与反序列化 在网络通信中&#xff0c;最重要的就是通过接口&#xff0c;将数据通过网络发送给另一台主机。那么另一台主机收到数据后&#xff0c;就可以对数据进…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...