代码:
```go
package main
import (
"fmt"
)
func main() {
var (
num1 float64
num2 float64
operator byte
num3 float64
num4 float64
operator2 byte
)
fmt.Println("请输入第一个数NUM1的值")
fmt.Scanln(&num1)
fmt.Println("请输入第二个数NUM2的值")
fmt.Scanln(&num2)
fmt.Println("请输入一个运算符")
fmt.Scanf("%c",&operator)
fmt.Printf("(num1)%v %c (num2)%v的结果是 \n",num1,operator,num2)
fmt.Println("请输入NUM3的值")
**fmt.Scanln(&num3)**
fmt.Println("请输入NUM4的值")
fmt.Scanln(&num4)
fmt.Println("输入运算符")
fmt.Scanf("%c",&operator2)
fmt.Printf("(num3)%v %c (num4)%v的结果是",num3,operator2,num4)
}
```
输出结果:
请输入第一个数NUM1的值
1
请输入第二个数NUM2的值
1
请输入一个运算符
+
(num1)1 + (num2)1的结果是
请输入NUM3的值
请输入NUM4的值
1
输入运算符
+
(num3)0 + (num4)1的结果是
**问题:NUM3直接跳过,不能输入值,NUM4可以输入请大师们赐教。。。。。**
![Scanln问题.png](https://static.studygolang.com/191126/78305c472bf6ae7e836a3593c494bcbb.png)
![Scanln问题2.png](https://static.studygolang.com/191126/230635849254c58c0029f8722889d869.png)
原因是执行fmt.Scanf("%c", &operator)时你其实输入的是+号和回车,
你%c只读了+号导致回车还在输入缓冲区。
所以之后执行fmt.Scanln(&num3)时会直接读取之前缓冲区残余的回车而不给你输入的机会。
解决方法是读取时读入换行符:
```fmt.Scanf("%c", &operator) -> fmt.Scanf("%c\n", &operator)```
#18
更多评论
当且仅当前面的输入类型不对,或者scan函数出错情况下,才会出现你的这种情况,所以,我们要捕获scan()系列方法的返回值,如果返回值不为nil,则不要再继续往下执行scan了,如果还继续scan,则会出现你的这种情况!
#2