Go语言中三个输入函数(scanf,scan,scanln)的区别

Go语言中三个输入函数(scanf,scan,scanln)的区别

在 Go 语言中,fmt 包提供了三种输入函数:Scanf、Scan 和 Scanln。这三个函数都是用于从标准输入读取数据并存储到变量中,但是它们在处理输入的方式上有所不同。下面详细解读每个函数的特点和用法。

1. fmt.Scanf

  • 用法:fmt.Scanf(format string, a …interface{}) (n int, err error)
  • 功能:根据格式化字符串 format 从标准输入读取数据,并将数据存储到提供的参数中。格式化字符串类似于 C 语言中的 scanf,例如 %d 表示读取一个整数,%s 表示读取一个字符串。
  • 输入终止条件:Scanf 读取输入时,会忽略空白字符,并且根据格式化字符串解析输入内容。输入可以包含换行符,但解析会按照格式字符串中的要求进行。

示例代码:

package mainimport ("fmt"
)func main() {var a intvar b stringfmt.Print("请输入一个整数和一个字符串(格式如:123 hello):")fmt.Scanf("%d %s", &a, &b) // 根据格式化字符串读取fmt.Println("整数:", a)fmt.Println("字符串:", b)
}
注意:
  • 如果输入的格式与指定的格式字符串不匹配,可能会导致读取失败或产生意外结果。

2. fmt.Scan

  • 用法:fmt.Scan(a …interface{}) (n int, err error)
  • 功能:读取由空格分隔的输入数据,并将数据存储到提供的参数中。它不需要格式化字符串,而是依次将输入的值赋给传入的变量。
  • 输入终止条件:输入以空格或换行符为分隔符,读取的值必须与传入的参数数量匹配。

示例代码:

package mainimport ("fmt"
)func main() {var a intvar b stringfmt.Print("请输入一个整数和一个字符串(用空格分隔):")fmt.Scan(&a, &b) // 直接读取输入到变量中fmt.Println("整数:", a)fmt.Println("字符串:", b)
}
注意:
  • 输入数据必须能正确解析为指定的变量类型,否则会出现错误。
  • 如果输入的值数量与变量数量不匹配,程序会等待进一步的输入。

3. fmt.Scanln

  • 用法:fmt.Scanln(a …interface{}) (n int, err error)
  • 功能:与 fmt.Scan 类似,但会在读取完所有指定的参数后检查是否有多余的输入。它要求读取的最后一个输入参数必须位于行的末尾,否则会返回一个错误。
  • 输入终止条件:读取到换行符结束,并要求读取的参数数量与传入的变量数量匹配。

示例代码:

package mainimport ("fmt"
)func main() {var a intvar b stringfmt.Print("请输入一个整数和一个字符串(用空格分隔,并按回车结束):")fmt.Scanln(&a, &b) // 读取输入到变量中,并检查换行fmt.Println("整数:", a)fmt.Println("字符串:", b)
}
注意:
  • 如果输入的值数量与传入的变量数量不匹配,或者在读取所有参数后还有多余的输入,则会返回错误。

总结比较

在这里插入图片描述

  • Scanf 更加灵活,可以指定格式,但要求输入格式必须匹配。
  • Scan 和 Scanln 更适合简单的输入读取,Scanln 还会检查是否有多余的输入。
    在实际应用中,根据需要选择适当的函数来读取用户输入。

这三种函数,都会将换行符,一起读取吗?

在 Go 语言中,fmt.Scanf、fmt.Scan 和 fmt.Scanln 这三个函数处理换行符的方式有所不同。让我们详细解释它们对换行符的处理:

1. fmt.Scanf

  • 换行符处理:Scanf 不会将换行符视为特殊的输入结束标记,它会根据指定的格式化字符串来解析输入数据。
  • 输入中包含换行符:如果换行符符合格式化字符串的要求,它会被视为空白字符而被忽略,否则会被保留在输入流中等待下一次读取

示例:

var a int
var b string
fmt.Print("请输入一个整数和一个字符串(如:123 hello):")
fmt.Scanf("%d %s", &a, &b) // 如果输入 "123\nhello",换行符会被忽略

在这个例子中,输入时如果用户输入 “123\nhello”,换行符会被忽略,因为它只是分隔了两个数据。

2. fmt.Scan

  • 换行符处理:Scan 将换行符视为空白字符,与空格一样被忽略。它会继续读取输入,直到满足所有变量的赋值。
  • 连续输入的情况:即使输入中有换行符,Scan 仍然会尝试从输入流中读取更多的数据,直到满足要求的变量数量。

示例:

var a int
var b string
fmt.Print("请输入一个整数和一个字符串(用空格分隔):")
fmt.Scan(&a, &b) // 如果输入 "123\nhello",换行符会被忽略

在这个例子中,输入 “123\nhello” 时,Scan 会忽略换行符并继续读取输入,直到读取到字符串 “hello”。

3. fmt.Scanln

  • 换行符处理:Scanln 会将换行符作为输入的结束标志。当所有的输入参数都读取完毕后,Scanln 要求输入流中不能有多余的数据。如果有多余的数据,即使是换行符,也会返回错误。
  • 换行符终止:它要求最后一个输入参数之后必须是换行符,否则会报错。

示例:

var a int
var b string
fmt.Print("请输入一个整数和一个字符串(用空格分隔,并按回车结束):")
fmt.Scanln(&a, &b) // 如果输入 "123 hello\n",换行符作为结束标志

在这个例子中,输入 “123 hello\n” 时,Scanln 会正常读取到整数和字符串,并认为换行符是输入的结束标志。

总结

  • Scanf:根据格式化字符串解析输入,换行符如果不影响解析会被忽略。
  • Scan:将换行符视为空白字符,会继续读取更多数据,直到满足所有变量的赋值要求。
  • Scanln:以换行符作为输入结束标志,如果在所有参数读取完毕后还有多余输入(除了换行符),会返回错误。
    换行符是否被读取取决于函数的设计和用法,Scanln 是唯一一个明确要求换行符作为结束标志的函数。

输入中包含换行符:如果换行符符合格式化字符串的要求,它会被视为空白字符而被忽略,否则会被保留在输入流中等待下一次读取。
对上面加粗部分的解释:
为了更好地理解 fmt.Scanf 如何处理输入中的换行符,下面举一个具体的例子来说明这种行为。

例子

package mainimport ("fmt"
)func main() {var a intvar b stringfmt.Print("请输入一个整数和一个字符串(格式:123 hello):")fmt.Scanf("%d %s", &a, &b)fmt.Println("a:", a)fmt.Println("b:", b)
}

示例 1:输入 “123 hello\n”

  • 输入内容:123 hello,然后按下 Enter(实际上输入的是 “123 hello\n”)。
  • 执行过程:

a.fmt.Scanf(“%d %s”, &a, &b) 尝试按格式化字符串 %d %s 解析输入数据。
b.%d 匹配到整数部分,读取 123,成功解析并赋值给变量 a。
c.%s 匹配到字符串部分,读取 hello,成功解析并赋值给变量 b。
d.剩余的换行符 \n 被 Scanf 视为分隔符(空白字符)而忽略掉。

结果:

  • 输出:
a: 123
b: hello

示例 2:输入 “123\nhello”

  • 输入内容:123,按下 Enter 键(输入 “123\n”),然后再输入 hello 并按下 Enter。
  • 执行过程:

a.fmt.Scanf(“%d %s”, &a, &b) 首先尝试解析 %d,从输入 “123\n” 中读取到整数 123 并赋值给 a。
b.接下来,fmt.Scanf 尝试读取 %s,但此时输入流中的字符是换行符 \n,它不符合字符串的格式要求。因此,Scanf 读取 %s 的尝试失败,换行符 \n 被保留在输入流中等待下一次读取。
c.因为读取 %s 失败,b 没有被赋值,程序继续等待下一个输入。
d.当用户再输入 hello 并按下 Enter 后,Scanf 成功读取到字符串 hello 并赋值给 b。

结果:

  • 输出:
a: 123
b: hello

解释

在示例 1 中,“123 hello\n” 中的换行符被视为空白字符,符合格式化字符串的要求,因此被忽略。而在示例 2 中,“123\nhello” 中的换行符不符合 %s 的格式要求,导致 Scanf 读取失败,换行符保留在输入流中,等待下一次读取。
这展示了 fmt.Scanf 处理换行符的两种情况:符合格式时忽略,不符合时保留在输入流中。

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

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

相关文章

网站被浏览器提示“不安全”,如何快速解决

当网站被浏览器提示“不安全”时,这通常意味着网站存在某些安全隐患,需要立即采取措施进行解决。 一、具体原因如下: 1.如果网站使用的是HTTP协议,应立即升级HTTPS。HTTPS通过使用SSL证书加密来保护数据传输,提高了网…

CSS设置层叠样式时报红(identifier expected css/selector expected css)

不规范语法 如上图所示,在一个 css 文件中添加层叠样式时报红:at-rule or selector expected,意思就是说我们的语句不符合 css 的语法书写规范,虽然不会导致启动报错并且还能达到预期的样式效果,但是对于有强迫症的同学…

养狗为什么需要宠物空气净化器?宠物空气净化器排行榜公布!

刚开始养狗时候怎么没人跟我说要买宠物空气净化器呢?那时候什么都不懂,只买了狗粮、喂食碗、狗笼、狗窝、便盆、牵引绳以及一些狗狗玩具。结果一个星期就家里就被搞得狗毛乱飞、臭味熏天。最后在养狗博主的建议下买了一台宠物空气净化器,开了…

ffmpeg视频滤镜:压缩-deflate

滤镜简述 deflate 官网链接 > https://ffmpeg.org/ffmpeg-filters.html#deflate 压缩滤镜可以降低视频的质量&#xff0c;从而减少视频的大小&#xff0c;虽然一定程度上影响了观看体验&#xff0c;但是方便传输。 滤镜使用 参数 threshold0 <int> …

函数的力量:掌握C语言的基石

目录 前言 标准库&#xff1a;C语言的百宝箱 头文件&#xff1a;库函数的藏宝图 实例分析&#xff1a;计算平方根的sqrt函数 功能描述 头文件包含的重要性 库函数文档的一般格式 自定义函数&#xff1a;释放你的编程创造力 函数的语法形式 函数的比喻 函数的举例 简化…

FreeSSl 申请免费证书,ACME实现自动化续期(https证书自动续期)

网站&#xff1a;https://freessl.cn/ 参考&#xff1a;ACME自动化快速入门 注册/登录后 1 添加域名 2 申请证书 安装acme.sh curl https://get.acme.sh | sh -s emailmyexample.com执行ACME.sh 申请证书命令 cd ~/.acme.sh/ # 直接拷贝上面步骤生成的命令 ./acme.sh …

springboot诊所就医系统-计算机毕业设计源码16883

目 录 摘要 1 绪论 1.1 研究背景 1.2选题背景及意义 1.3论文结构与章节安排 2 诊所就医系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 …

论文笔记:通用世界模型WorldDreamer

整理了WorldDreamer: Towards General World Models for Video Generation via Predicting Masked Tokens 论文的阅读笔记 背景模型实验 背景 现有的世界模型仅限于游戏或驾驶等特定场景&#xff0c;限制了它们捕捉一般世界动态环境复杂性的能力。针对这一挑战&#xff0c;本文…

雷池社区版有多个防护站点监听在同一个端口上,匹配顺序是怎么样的

如果域名处填写的分别为 IP 与域名&#xff0c;那么当使用进行 IP 请求时&#xff0c;则将会命中第一个配置的站点 以上图为例&#xff0c;如果用户使用 IP 访问&#xff0c;命中 example.com。 如果域名处填写的分别为域名与泛域名&#xff0c;除非准确命中域名&#xff0c;否…

关于写删除接口的一些理解

背景 在前两篇文章中&#xff0c;我讲了如何编写查询接口和新增接口。这篇文章将讲解如何编写删除接口。 “删除”接口的总体思路 一般情况下&#xff0c;删除接口的思路是通过记录的id来删除某一行。在实际工作中&#xff0c;我还没有遇到过使用其他字段来删除记录的情况&am…

TinTin Web3 动态精选:Vitalik 探讨以太坊协议,Solana ETN 开启质押功能

TinTin 快讯由 TinTinLand 开发者技术社区打造&#xff0c;旨在为开发者提供最新的 Web3 新闻、市场时讯和技术更新。TinTin 快讯将以周为单位&#xff0c; 汇集当周内的行业热点并以快讯的形式排列成文。掌握一手的技术资讯和市场动态&#xff0c;将有助于 TinTinLand 社区的开…

Unity-Editor扩展,引擎管理AudioClip,音乐音效快捷播放功能

目录 选择一个Audio 音频文件即会 关键在于三个快捷模式 播放&#xff0c; 自动播放 循环播放 根本不需要Editor扩展开发 没找到虚幻引擎的audio 的管理是怎么样的 参考&#xff1a; 本来&#xff0c;觉得没有快捷方式&#xff0c;播放很不爽 想自定义搞一个&#xff…

win10怎么卸载软件干净?电脑彻底删除软件的方法介绍,一键清理卸载残留!

电脑上经常会下载各种各样的软件来协助我们办公&#xff0c;不同的软件能够满足不同的需求。 但是不少软件可能使用频率没有那么高&#xff0c;甚至完全不使用。这个时候就需要将这些不常用的电脑软件卸载掉了&#xff0c;卸载软件能够释放一定的存储空间&#xff0c;提高电脑…

【WebSocket实战】——创建项目初始架构

这一篇文章主要是为了介绍如何在visual中创建一个项目并服务于我们要做的websockt项目&#xff0c;所以这里如果已经懂得的人&#xff0c;可以直接跳过。 目录 1&#xff09;创建空白解决方案 2&#xff09;创建asp.NET Core项目 3&#xff09;创建winform项目作为客户端1 …

纳斯达克大屏投放:为什么越来越多的企业要投放纳斯达克户外广告

纳斯达克大屏投放&#xff1a;为什么越来越多的企业要投放纳斯达克户外广告 一、纳斯达克户外大屏的独特魅力 在全球商业的舞台上&#xff0c;纳斯达克户外大屏以其无与伦比的影响力和曝光度&#xff0c;成为众多企业竞相追逐的广告投放目标。为什么越来越多的企业选择在纳斯…

react18中的函数组件底层渲染原理分析

react 中的函数组件底层渲染原理 react组件没有局部与全局之分&#xff0c;它是一个整体。这点跟vue的组件化是不同的。要实现 react 中的全局组件&#xff0c;可以将组件挂在react上&#xff0c;这样只要引入了react&#xff0c;就可以直接使用该组件。 函数式组件的创建 …

Nestjs请求处理顺序

刚接触Nestjs的小白不知道Nestjs的请求处理顺序的话&#xff0c;这会非常使得咱们服务端不好使用。 下面是请求处理顺序图&#xff1a; 总结&#xff1a; 守卫&#xff08;Guards&#xff09; 守卫是请求处理的第一层&#xff0c;用于确定请求是否应该继续处理。它们通常用于身…

Detectron2和LSTM进行人体动作识别

1. 项目简介 本项目旨在开发一个人体动作识别系统&#xff0c;利用深度学习模型Detectron2和LSTM&#xff08;长短时记忆网络&#xff09;实现对视频中人体动作的精确识别与分类。项目背景是由于在现代智能监控、健康管理、体育分析等领域中&#xff0c;对人体动作的自动识别和…

旧电脑安装Win11提示“这台电脑当前不满足windows11系统要求”,安装中断。怎么办?

前言 最近有很多小伙伴也获取了LTSC版本的Win11镜像&#xff0c;很大一部分小伙伴安装这个系统也是比较顺利的。 有顺利安装完成的&#xff0c;肯定也有安装不顺利的。这都是很正常的事情&#xff0c;毕竟这个镜像对电脑硬件要求还是挺高的。 有一部分小伙伴在安装Windows11 …

C++对象模型:关于对象

C语言和C对比 ⭐ 关联知识点&#xff1a;C和C语言区别 &#xff08;1&#xff09;C 语言的特点 简洁与高效&#xff1a;C 语言被设计为一种系统级的编程语言&#xff0c;它提供了对硬件的直接访问能力&#xff0c;并且编译后的代码通常非常紧凑&#xff0c;运行效率高。 全…