问题描述
代码大致内容:输入要查询的年份,再输入要查询的月份,返回该年该月的天数
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("你输入的月份有误")
}
}
}
运行结果如下: