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

7 回复

为什么你要在浮点数里放三个点?这完全没有道理。

更多关于Golang中fmt.Scanf的错误检查问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


链接

仍然出现同样的情况,为什么我输入三个点而不是一个点时程序不会崩溃?

请查看扫描功能的文档。它描述了fmt.Scanf的工作原理。

amjad:

4.5.6.6

这真的是你的输入吗?为什么会有三个点?

而且,4.56.6 都不是整数。

好的,如果变量是整数类型,而当你输入浮点数时,程序是否应该退出?

https://pastebin.com/Dr04Q93n

试试这个:

package main

import (
	"fmt"
	"os"
)

func main() {
	var first, second float64

	fmt.Printf("first: ")
	_, err := fmt.Scanf("%f", &first)
	if err != nil {
		os.Exit(1)
	}

	fmt.Printf("second: ")
	_, err = fmt.Scanf("%f", &second)
	if err != nil {
		os.Exit(1)
	}

	sum := first + second
	fmt.Printf("Sum of %f and %f is %f", first, second, sum)
}

https://play.golang.com/p/Zcdln63c5Zf

在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 会触发错误提示。

回到顶部