为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Scanf的输入总是0?

为什么Scanf的输入总是0?

Go
开心每一天1111 2021-11-01 10:41:15
我试图从用户那里获取输入并将其打印出来,但显然距离的值是0,在我做了一些输入之后。这是代码:type Person struct {    name string    age int    ambition string}func (p *Person) walking() {    var distance int    fmt.Println("Enter the distance")    fmt.Scanf("%f", &distance)    if distance < 9 {        fmt.Println(p.name, " is walking towards that direction in ", distance,            "kilometer")    } else {        fmt.Println("This is an error, ignore this")    }}正如您所看到的,每当我尝试在主函数上运行此命令时,fmt.Println(p.name, " is walking towards that direction in ", distance, "kilometer")即使距离的值大于9.func main() {    p := new(Person)    p.name = "Joker"    p.walking()}p.walking()将始终打印距离为0?谁能向我解释这里发生了什么?
查看完整描述

1 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

您使用了错误的格式字符串。%f用于扫描浮点数,但您的变量distance类型为int,因此您应该使用%d:


fmt.Scanf("%d", &distance)

或者将distance变量声明为浮点数,然后您可以使用%f:


var distance float64

fmt.Println("Enter the distance")

fmt.Scanf("%f", &distance)

笔记:


fmt.Scanf()返回成功扫描的项目数和可选错误。您应该习惯于处理 Go 中的错误,这会为您节省大量时间。


通过存储和打印 的返回值来最小化Scanf():


var distance int

fmt.Println("Enter the distance")

n, err := fmt.Scanf("%f", &distance)

fmt.Println(n, err)

印刷:


0 bad verb %f for integer

这会立即告诉您0已扫描项目并出现错误:bad verb %f for integer这几乎是不言自明的。


这也解释了为什么您总是看到0打印出的公里数:您的distance变量被初始化为0( 的零值int)并且它永远不会改变。


如果扫描成功,您将看到以下输出:


1 <nil>

这意味着成功扫描了一项(distance)并且没有错误。


如果您一次Scanf()调用扫描多个项目,则n可能大于1当然(例如fmt.Scanf("%f %d", &distance, &temp))。


查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 262 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信