代码:
```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)
经过仔细思考,还是决定给你写出捕获异常并且进行异常处理!
```
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
//下面对scan中是否带ln进行讲解
var a byte
var b int
var b1 int
var c int
stdin := bufio.NewReader(os.Stdin)
for {
fmt.Println("请输入一个byte值:")
count, err := fmt.Fscan(stdin, &a)
//stdin.ReadString('\n')
//count, err := fmt.Fscan(stdin, &a)
//stdin.ReadString('\n')
if err != nil {
fmt.Println(err)
fmt.Printf("count:%d\n", count)
fmt.Println("您的输入有误,请重新输入")
stdin.ReadString('\n')
continue
}
fmt.Println("输出:", a)
break
}
for {
fmt.Println("请输入一个int值:")
//没ln说明了填充满所有的变量为止,而不是以换行符为停止符!同时遇到换行符也当做间隔多个输入值的空格!
count, err := fmt.Fscan(stdin, &b, &b1)
//下面这这种方式也可以,有ln说明了是以换行符为停止符来停止scan的!而不是以填满变量为止!即时没填满也会停止scan
//count, err := fmt.Fscanln(stdin, &b)
//stdin.ReadString('\n')//不应该放在这里
if err != nil {
fmt.Println(err)
fmt.Printf("count:%d\n", count)
fmt.Println("您的输入有误,请重新输入")
//如果输错了,对于scan来说,那么\n肯定没被读取扫描出来的,因此我们要消耗掉\n之前的所有因错误而停止扫描的字符串,否则我们在输入时候会被要求多输入一个换行符
//对于有ln的scan,则不需要下面的这行代码,因为scanln会自动读取换行符,而scan不会!
stdin.ReadString('\n')
continue
}
//如果输对了,那么Fscan会把\n当做空格,每个空格前面的一个字符串被当做输入值,空格分隔的所有输入的字符串值被赋值给所有变量后会自动结束scan
//所以,\n还是被消耗掉了。
//对于Fscanln不会把换行符当做空格,同时会在换行符处停止扫描,即使变量还没被完全填充!!
//不过既然能来到这里,说明了输入对了,那么我们会在读取完换行符后就 会停止整个扫描,所以这里就不必写
//stdin.ReadString('\n')了,否则我们在输入时候会被要求多输入一个换行符
fmt.Println("输出1:", b)
fmt.Println("输出2:", b1)
break
}
for {
fmt.Println("请输入一个int值:")
count, err := fmt.Fscan(stdin, &c)
//stdin.ReadString('\n')
if err != nil {
fmt.Println(err)
fmt.Printf("count:%d\n", count)
fmt.Println("您的输入有误,请重新输入")
stdin.ReadString('\n')
continue
}
fmt.Println("输出:", c)
break
}
//输出:
//请输入一个byte值:
//a
//expected integer
//count:0
//您的输入有误,请重新输入
//请输入一个byte值:
//v
//expected integer
//count:0
//您的输入有误,请重新输入
//请输入一个byte值:
//97
//输出: 97
//请输入一个int值:
//11
//
//
//
//22
//输出1: 11
//输出2: 22
//请输入一个int值:
//33
//输出: 33
}
```
#15
更多评论
当且仅当前面的输入类型不对,或者scan函数出错情况下,才会出现你的这种情况,所以,我们要捕获scan()系列方法的返回值,如果返回值不为nil,则不要再继续往下执行scan了,如果还继续scan,则会出现你的这种情况!
#2