Golang中fmt.Scanf的错误检查问题
Golang中fmt.Scanf的错误检查问题
你好
我是Go语言的新手。我正在测试版本1.11.8
我尝试读取一个浮点数并进行错误检查。
```go
var first float64
_,err = fmt.Scanf("%f", &first)
if err != nil {
fmt.Printf("%f is not a valid float")
}
_,err2 := fmt.Scanf("%f", &second)
if err2 != nil {
fmt.Println("second number is not a valid numnber , exiting the program")
os.Exit(1)
}
sum := first + second
fmt.Printf("Sum of %f and %f is %f" , first,second ,sum)
}
当我执行这个程序时,出现以下错误: 请输入第一个整数 4.5.6.6
请输入第二个整数 4.500000和6.600000的和是11.100000
我的问题是:如果我输入4.5.5.6,为什么没有生成错误信息?这些点号是被当作换行符处理了吗?
更多关于Golang中fmt.Scanf的错误检查问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
为什么你要在浮点数里放三个点?这完全没有道理。
更多关于Golang中fmt.Scanf的错误检查问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
仍然出现同样的情况,为什么我输入三个点而不是一个点时程序不会崩溃?
请查看扫描功能的文档。它描述了fmt.Scanf的工作原理。
amjad:
4.5.6.6
这真的是你的输入吗?为什么会有三个点?
而且,4.5 和 6.6 都不是整数。
好的,如果变量是整数类型,而当你输入浮点数时,程序是否应该退出?
在Go语言中,fmt.Scanf 使用空格(包括换行符)作为输入分隔符。当你输入 4.5.6.6 时,fmt.Scanf("%f", &first) 会读取直到遇到第一个非数字字符(第一个点号后的第二个点号)为止的部分,即 4.5,并将其成功解析为浮点数 4.500000。剩余的 .6.6 会留在输入缓冲区中,导致后续的 fmt.Scanf("%f", &second) 读取到 6.6,解析为 6.600000,而不会触发错误。
这种行为是因为 %f 格式说明符在遇到无效字符(如第二个点号)时会停止读取,但不会返回错误,只要已读取的部分可以解析为有效的浮点数。要验证输入是否完全匹配浮点数格式,可以使用 fmt.Sscanf 结合字符串检查,或改用 bufio.Scanner 读取整行再解析。以下是修改后的示例代码:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("请输入第一个浮点数: ")
scanner.Scan()
firstInput := strings.TrimSpace(scanner.Text())
first, err := strconv.ParseFloat(firstInput, 64)
if err != nil {
fmt.Printf("%s 不是有效的浮点数\n", firstInput)
return
}
fmt.Print("请输入第二个浮点数: ")
scanner.Scan()
secondInput := strings.TrimSpace(scanner.Text())
second, err := strconv.ParseFloat(secondInput, 64)
if err != nil {
fmt.Printf("%s 不是有效的浮点数\n", secondInput)
return
}
sum := first + second
fmt.Printf("%f 和 %f 的和是 %f\n", first, second, sum)
}
这个代码使用 bufio.Scanner 读取整行输入,并通过 strconv.ParseFloat 解析,确保整个输入字符串必须是有效的浮点数格式,否则会返回错误。例如,输入 4.5.6.6 会触发错误提示。


