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

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 处理换行符的两种情况:符合格式时忽略,不符合时保留在输入流中。

相关文章:

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

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

uniapp使用html2canvas时,页面内的image元素模糊

不废话很简单只需要将image改成img就行 改之前 改之后 原因可能是因为uniapp里面的image标签做了某种处理...

华为交换机堆叠

堆叠方式 堆叠卡堆叠: 堆叠卡堆叠又可以分为两种情况: 交换机之间通过专用的堆叠插卡ES5D21VST000及专用的堆叠线缆连接。堆叠卡集成到交换机后面板上,交换机通过集成的堆叠端口及专用的堆叠线缆连接。 业务口堆叠: 业务口堆…...

Spring Boot框架下中小企业设备管理系统开发

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理中小企业设备管理系统的相关信息成为必然。…...

鸿蒙开发融云demo消息未读数

鸿蒙开发融云demo消息未读数 跟着我一步步搭建带界面的融云demo,这次是要显示未读数,未读数有两个,一个是消息列表的未读数,一个是主页消息tab上的未读数。 一、消息列表的未读数 先看下效果图: 关键代码如下&#…...

非对称加密算法(RSA):原理、应用与代码实现

一、引言 在当今数字化时代,信息安全成为了至关重要的议题。非对称加密算法作为保障信息安全的核心技术之一,在数据加密、数字签名、身份验证等领域发挥着不可或缺的作用。其中,RSA 算法以其可靠性、安全性和广泛的适用性,成为了…...

docker部署SQL审核平台Archery

1、概述 Archery 是一个开源的 SQL 审核平台,专为数据库的 SQL 运维和管理而设计,广泛应用于企业的数据库运维工作中。其主要功能是帮助数据库管理员和开发人员实现 SQL 审核、SQL 执行、在线执行、查询、工单管理、权限控制等数据库管理相关的操作。 Archery 的主要功能包括…...

ceph 删除rbd 锁的命令

文章目录 前言操作步骤 前言 记录一下ceph 删除rbd锁的命令 rbd lock rm poolname/uuid_disk "ID" Locker操作步骤 云主机实例的uuid是:fec52819-3b00-48e1-9f3b-c68c717bd619 # 获取rbd块的信息 rbd info nova/fec52819-3b00-48e1-9f3b-c68c717bd619…...

MySQL【知识改变命运】01

库的基本操作语法 1:SQL的简介2:SQL的基本分类3:库的基本操作1:查看库2:创建数据库1:创建一个diayang库2: ⾃定义⼀个数据库名,如果数据库不存则创建,3:查看警告信息4:字符集编码和校验(排序)规…...

苍穹外卖 Maven依赖配置

苍穹外卖所用到的Maven坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…...

Lucas带你手撕机器学习——SVM支持向量机

#1024程序员节&#xff5c;征文# 支持向量机&#xff08;SVM&#xff09;的详细讲解 什么是SVM&#xff1f; 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种用于分类和回归的监督学习算法。它的主要任务是从给定的数据中找到一个最佳的决策…...

将后端返回的网络url转成blob对象,实现pdf预览

调用e签宝返回的数据是网络链接就很让人头疼&#xff0c;最后想到可以转换成blob对象&#xff0c;便在百度上找到方法&#xff0c;记录一下。 祝大家节日快乐&#xff01;&#xff01; 代码在最后&#xff01;&#xff01;&#xff01;&#xff01; 代码在最后&#xff01;&a…...

民峰金融智能交易模型的应用与未来趋势

随着科技的进步&#xff0c;金融市场中的智能化交易模式逐渐成为主流。民峰金融在智能交易模型领域不断创新&#xff0c;凭借先进的技术优势&#xff0c;成为了业内的佼佼者。本文将探讨民峰金融如何通过智能交易模型提升市场交易效率&#xff0c;以及未来可能的发展趋势。 一…...

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑负荷时空迁移的5G基站与配电网协同优化运行 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…...

数据结构中的堆(Heap)

堆&#xff08;Heap&#xff09;是计算机科学中一类特殊的数据结构&#xff0c;在计算机科学领域中扮演着至关重要的角色。以下是对堆的深入了解&#xff0c;包括其定义、特性、类型、底层实现原理以及广泛的应用场景。 一、堆的定义与特性 堆通常被看作是一棵完全二叉树的数…...

Linux误删文件找回

前言 公司要迁移文件服务器&#xff0c;100G文件夹执行了mv操作&#xff0c;由于网络都懂Shell卡死导致命令执行中途停止了。一看目标文件夹才10G的内容&#xff0c;赶紧去源文件夹查看~~~不料空空如也 完蛋&#xff0c;咋整&#xff0c;出事了&#xff0c;有备份吗&#xff1f…...

深入计算机语言之C++:类与对象(中)

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;从C语言到C语言的渐深学习 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 一、默认成员函数 如果一个类中什么成员都没有&…...

51单片机快速入门之 IIC I2C通信

51单片机快速入门之 IIC 总线通信 协议: 空闲时 SCL/SDA 为高电平SCL高时 SDA下降沿 为开始信号开始信号之后: SCL高电平时 SDA不能变化 , SCL低电平时 SDA才可变 SDA 传数据时 从高到低按位传输 SCL一个脉冲高电平对应一位数据 4.SCL高电平时 SDA上升沿 为停止信号 数…...

腾讯推出ima.copilot智能工作台产品 由混元大模型提供技术支持

腾讯公司近期推出了一款名为ima.copilot&#xff08;简称ima&#xff09;的智能工作台产品&#xff0c;它由腾讯混元大模型提供技术支持。这款产品旨在通过其会思考的知识库&#xff0c;为用户开启搜读写的新体验。ima.copilot的核心功能包括知识获取、打造专属知识库以及智能写…...

1024是什么日子

【1024程序员日数字编织梦想的赞歌】 在这个由二进制构建的宇宙里&#xff0c;每一行代码都是通往未来的桥梁&#xff0c;每一位程序员都是这浩瀚数字海洋中的航海家。今天&#xff0c;10月24日&#xff0c;不仅是一个简单的日期&#xff0c;它是属于我们的节日——程序员日&a…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...