go语言中的Scanf()输入函数

Scanf() 第一种情况

package main

import "fmt"

func main() {
    var a int
    for {
       fmt.Println("请输入一个整数:")
       fmt.Scanf("%d", &a)
       fmt.Println("----------------", a)
    }
}

运行结果:

在这里插入图片描述

解释:

出现这种现象是因为程序执行的逻辑顺序所致。具体过程如下:
1.第一次循环输入 :

  • 当输入 1 并按下 Enter 键时,实际输入的数据是 1\n。
  • fmt.Scanf(“%d”, &a) 会读取 1 这个整数,赋值给变量 a。此时,换行符 \n 还留在输入缓冲区中。
  • 然后程序执行 fmt.Println(a),输出 1 到控制台。

2.进入下一次循环:

  • 控制台打印 “请输入一个整数:”,这是 fmt.Print(“请输入一个整数:”) 的输出。
  • 此时,缓冲区中仍然有上一次输入残留的 \n。当 fmt.Scanf(“%d”, &a) 尝试读取时,发现缓冲区中的字符 \n 不是整数格式,导致读取失败。
  • 由于 Scanf 的读取失败,并没有为 a 赋新值,a 保持了之前的值 1。但是读取失败之后,程序继续循环,再次打印 “请输入一个整数:”,使控制台显示了两次 “请输入一个整数:”。

3.第二次输入:

  • 由于上一次的换行符造成了读取失败,程序这一次没有等待新的输入,就直接进入下一次循环,提示 “请输入一个整数:”。

解决方法

可以在读取失败后手动清除缓冲区中的换行符,避免这种情况。之前提到的使用 bufio.Reader 来清空输入缓冲区的方式可以解决这个问题。
修改后的代码如下:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    var a int
    reader := bufio.NewReader(os.Stdin) // 创建一个 bufio.Reader
    for {
        fmt.Print("请输入一个整数:")
        _, err := fmt.Scanf("%d", &a)
        if err != nil {
            fmt.Println("输入无效,请输入一个整数")
            // 清除缓冲区中的剩余内容
            reader.ReadString('\n')
            continue
        }
        fmt.Println(a)
        // 清除缓冲区中的换行符,防止干扰下次输入
        reader.ReadString('\n')
    }
}

这样处理后,可以确保每次输入都能正确读取,避免因换行符残留导致的错误。

Scanf() 第二种情况

package main

import "fmt"

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

运行结果:

解释:

出现这个问题的原因是,在执行 fmt.Scanf(“%d %s”, &a, &b) 时,输入了 123 并按下 Enter 键,程序只读取到了一个整数,而未能读取第二个字符串。这是因为 fmt.Scanf 解析输入时遇到了换行符,而 %s 格式要求必须在同一行读取字符串。

具体原因

当你输入 123 并按下 Enter 键时,Scanf 会按照格式化字符串 %d %s 的顺序尝试读取数据:

1.%d 读取到整数 123,这一步成功。
2.紧接着,Scanf 尝试读取一个字符串(由 %s 表示),但遇到了换行符(Enter 键输入的 \n),导致读取字符串失败。
3.因为未能读取到符合 %s 格式的字符串,程序结束了输入处理,只输出了整数的值。

解决方法

可以采用以下几种方式解决这个问题:

方法 1:使用 fmt.Scanln

fmt.Scanln 可以处理换行符,并在读取到换行符时结束输入。修改代码如下:

var a int
var b string
fmt.Print("请输入一个整数和一个字符串(如:123 hello):")
fmt.Scanln(&a, &b) // 使用 Scanln 来读取整数和字符串
fmt.Println("整数:", a)
fmt.Println("字符串:", b)

这种方式下,输入 123 然后按 Enter 键,程序会等待输入第二个字符串。

方法 2:使用 bufio.Reader 读取整行输入

可以使用 bufio.Reader 读取整行输入,然后使用 fmt.Sscanf 来解析输入的数据:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    var a int
    var b string
    fmt.Print("请输入一个整数和一个字符串(如:123 hello):")
    
    reader := bufio.NewReader(os.Stdin)
    input, _ := reader.ReadString('\n')
    input = strings.TrimSpace(input) // 去除输入的换行符和空白

    fmt.Sscanf(input, "%d %s", &a, &b)
    fmt.Println("整数:", a)
    fmt.Println("字符串:", b)
}

在这个版本中,bufio.NewReader 读取整行输入,然后通过 fmt.Sscanf 解析输入数据。

总结

  • fmt.Scanf 在读取数据时,换行符会导致输入解析中断,从而无法继续读取剩余的数据。
  • fmt.Scanln 和 bufio.Reader 可以更好地处理换行符,以读取用户的完整输入。

Scanf() 键盘录入时,要注意的问题

一定要严格按照格式化字符串的格式输入,比如

1.fmt.Scanf(“%d %s”, &a, &b),%d %s,两者之间是用空格分隔的

正确示例:

在这里插入图片描述

失败示例:

在这里插入图片描述

之所以没有将123hello作为一个整体读取,是因为程序在读取完123后,在读取h时,发现h不符合%d的格式,所以只读取了123,而没有读取hello

2.fmt.Scanf(“%d,%s”, &a, &b),%d,%s,两者之间是用逗号分隔的

正确示例:

在这里插入图片描述

3.fmt.Scanf(“%d%s”, &a, &b),%d%s,两者之间是紧挨着的

正确示例:

在这里插入图片描述

当要输入两个字符串时,应注意的问题:

package main

import "fmt"

func main() {
    var a string
    var b string
    fmt.Println("请输入两个字符串(如:123 hello):")
    fmt.Scanf("%s%s", &a, &b)
    fmt.Println("----------------", a)
    fmt.Println("++++++++++++++++", b)
}

1.当fmt.Scanf(“%s%s”, &a, &b)中的%s%s之间没有任何间隔时,有如下两种情况:

在这里插入图片描述
在这里插入图片描述

2.当fmt.Scanf(“%s %s”, &a, &b)中的%s %s之间用空格间隔时 :

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 8在Linux虚拟机修改IP地址,出现:错误:“ens160“ 不是活动的连接。错误:未提供活动连接。

问题:错误:"ens160" 不是活动的连接。错误:未提供活动连接。 1.查看网络服务运行状态: 1)CentOS 7执行命令:systemctl status network 2)CentOS 8执行命令:systemctl status NetworkManager&a…

双十一有哪些适合学生党的好物?五款学生党必备好物分享

在双十一这个全民狂欢的购物盛宴中,不仅仅是寻找生活的小确幸,更是自我提升与投资的最佳时机。学习,作为个人成长的阶梯,其相关的好物选择显得尤为重要。本文精选了一系列学习、生活神器,旨在为您的学习之旅增添动力与…

手机防窥膜的工作原理是怎样的?有必要使用防窥膜吗?

在信息高度发达的社会中,我们通过手机可以实现非常多的操作,同时手机中有存在许多我们的隐私信息,伴随使用手机的时间增多,手机中的信息也有可能被暴露,尤其是在公共场所旁人很容易通过瞥视你的手机屏幕获取到一些信息…

青少年编程能力等级测评CPA C++(三级)-试卷1

青少年编程能力等级测评CPA C(三级)-试卷1 一、单项选择题(共15题,每题3分,共45分) CP3_1_1.以下有关模拟算法的叙述中,不正确的是( )。 A.模拟…

普通数组矩阵

文章目录 普通数组一、最大子数组二、合并区间三、轮转数组四、除自身以外数组的乘积五、缺失的第一个正数 普通数组 一、最大子数组 题目链接 方法一:动态规划 方法二:前缀和(有点难理解) 二、合并区间 题目链接 三、轮…

软件部署-Docker容器化技术(二)

上一期分享了Docker的一些基本内容,这一期主要对构建基础镜像和Docker网络、文件挂载再展开分享下,可能不一定做得很好,主要是在学习的过程中有一些自己的总结和思考,和大家一起学习。 名词说明:这里的宿主机是指liun…

【D3.js in Action 3 精译_037】4.1 DIY 实战:D3 源码分析之——d3.timeFormat() 函数

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…

Shopee虾皮登录不了的常见原因及解决方式

在近年来,随着电子商务的迅猛发展,Shopee虾皮作为东南亚地区的领先购物平台,吸引了大量用户。一些用户在使用过程中常常遇到登录问题,而登录不了的原因可能多种多样,包括网络连接不稳定、账号信息输入错误,…

【搭建个人图库】Docker部署Piwigo图库与公网环境远程传图全攻略

文章目录 前言1. 安装Docker2. 创建并启动Piwigo容器3. 本地访问测试与简单使用4. 公网远程访问本地Piwigo4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定公网地址远程访问 前言 本文和大家分享一下如何在Linux系统使用Docker部署一款开源的网络图片库管理系统Piw…

54页可编辑PPT | 大型集团企业数据治理解决方案

这份PPT是关于大型集团企业数据治理的全面解决方案,它详细介绍了数据治理的背景、需求、管理范围、框架、解决思路,以及数据治理在实际操作中的关键步骤。内容涵盖了数据架构、数据质量、数据应用等方面的问题,并提出了数据资产透视、智能搜索…

K8S如何基于Istio重新实现微服务

K8S如何基于Istio重新实现微服务 认识 Istio前言Istio 的理念Istio 的架构数据平面控制平面服务与 Istio 的关系 Istio 实践环境准备安装 Helm安装Istio 使用 Istio 代理运行应用情感分析应用的架构使用 Istio 代理运行应用Sidecar 注入Ingress 网关网关资源VirtualService 资源…

离线部署jdk8,jdk17, jdk21

目录 一、下载地址二、环境三、离线部署思路步骤 四、部署脚本 在开发过程中,有时我们需要在同一台机器上安装多个不同版本的 JDK,以满足不同项目的需求。本文将详细介绍如何在 Ubuntu 24.04 中离线安装 JDK8、JDK17 和 JDK21。 一、下载地址 建议下载O…

融合DevOps打造企业高效流程体系的实践与探索

一、引言 转眼间,我已毕业十多年,在IT领域深耕不辍,曾涉足全栈研发、大数据研发、架构设计与项目管理等多个岗位,更主导过公司从市场到交付再到运营的全链条流程建设。在这漫长的职业生涯中,一个问题始终萦绕在我心头&…

web前端练习

01 代码&#xff1a;HTML部分 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>search</title>…

华为配置BFD状态与接口状态联动实验

组网图形 图1 配置BFD状态与接口状态联动组网图 BFD简介配置注意事项组网需求配置思路操作步骤配置文件 BFD简介 为了减小设备故障对业务的影响&#xff0c;提高网络的可靠性&#xff0c;网络设备需要能够尽快检测到与相邻设备间的通信故障&#xff0c;以便及时采取措施&…

百科知识|选购指南

百科知识||选购指南 百科知识选购指南茶叶分类茶叶的味道来源茶叶制作步骤名茶其他一些茶叶的知识 百科知识 选购指南 茶叶 分类 茶叶种类: 六大茶类完美分析介绍&#xff01;茶友推荐收藏 (aboxtik.com) 1.绿茶&#xff08;发酵率0%&#xff09; 2.白茶&#xff08;发酵率…

对杨笠没有意见,但对京东有 | 生活周刊 #5

持续分享高效率工具&#xff0c;以及日常生活、个人成长、运动健康和法律案例等的内容&#xff0c;欢迎关注 &#x1f4f6; 关于杨笠 对于杨笠&#xff0c;我对她没什么偏见&#xff0c;也好奇为什么代言京东会触发这么大的反弹&#xff0c;直到我看到杨笠的冒犯的艺术&#x…

Axure垂直菜单展开与折叠

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;Axure垂直菜单展开与折叠 主要内容&#xff1a;垂直菜单单击实现展开/折叠&#xff0c;点击各菜单项显示选中效果 应用场景&#xff1a;后台菜单设…

【python实战】利用代理ip爬取Alibaba海外版数据

引言 在跨境电商的业务场景中&#xff0c;数据采集是分析市场、了解竞争对手以及优化经营策略的重要环节。然而&#xff0c;随着越来越多企业依赖数据驱动决策&#xff0c;许多跨境电商平台为了保护自身数据&#xff0c;采取了更严格的防护措施。这些平台通过屏蔽大陆IP地址或部…

专业135+总分400+西安交通大学815869(原909)信号与系统考研经验电子信息与通信工程,真题,大纲,参考书

经过将近一年的考研复习&#xff0c;终于梦圆西安交大&#xff0c;今年专业课815(和专硕869&#xff08;原909&#xff09;差不多)信号与系统135&#xff0c;总分400&#xff0c;回想这一年的复习还有很多经验和大家分享&#xff0c;希望可以对大家复习有所帮助&#xff0c;少走…