连续两个fmt.Printf,第二个scanf无法识别

问题描述

代码大致内容:输入要查询的年份,再输入要查询的月份,返回该年该月的天数

func main() {
	for {
		var month, year int
		month = 2
		fmt.Printf("请输入年:(输入0则退出循环)\n")
		fmt.Scanf("%d", &year)
		if year == 0 {
			break
		}
		fmt.Printf("请输入月:\n")
		fmt.Scanf("%d", &month)
		day := day(month, year)
		if day != -1 {
			fmt.Printf("你查询的这一月的天数为%d天\n", day)
		} else {
			fmt.Println("你输入的月份有误")
		}
	}
}

当输入年份后按回车键,直接跳过了月份的输入,继续向后执行:

此处并未输入月份,仍然输出了天数,是因为上次运行留存了month = 2。

如果在输入年份的时候直接回车,则直接退出循环,运行结束。


 

原因分析:

第二个fmt.Scanf无法接收用户的输入是因为它受到了前面的输入操作的影响。

在第一个循环迭代中,当用户输入年份后,按下"Enter"键时,输入的数据会包含一个换行符(\n)。然后,当程序执行到第二个fmt.Scanf时,它会读取之前的换行符作为输入,而不是等待用户输入月份。

解决这个问题的方法是在两个fmt.Scanf之后都添加一个额外的fmt.Scanln语句,用于读取并处理换行符。以下是修改后的代码:

func main() {
	for {
		var month, year int
		month = 2
		fmt.Printf("请输入年:(输入0则退出循环)\n")
		fmt.Scanf("%d", &year)
		fmt.Scanln()
		if year == 0 {
			break
		}
		fmt.Printf("请输入月:\n")
		fmt.Scanf("%d", &month)
		fmt.Scanln()
		day := day(month, year)
		if day != -1 {
			fmt.Printf("你查询的这一月的天数为%d天\n", day)
		} else {
			fmt.Println("你输入的月份有误")
		}
	}
}

 运行结果如下:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值