为什么scanf的输入总是0?

Why the input of Scanf is always 0?

我正在尝试从用户那里获取输入并将其打印出来,但在我进行了一些输入后,距离的值显然是 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"),即使 distance 的值大于 9

func main() {
    p := new(Person)
    p.name = "Joker"

    p.walking()
}

p.walking() 总是将距离打印为 0?谁能给我解释一下这是怎么回事?

您使用了错误的格式字符串。 %f用于扫描浮点数,但是你的变量distanceint类型的,所以你应该使用%d:

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

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

var distance float64
fmt.Println("Enter the distance")
fmt.Scanf("%f", &distance)

注:

fmt.Scanf() returns 成功扫描的项目数,以及一个可选的错误。你应该习惯在 Go 中处理错误,这会节省你很多时间。

通过存储和打印 Scanf() 的 return 值作为最小值:

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 变量被初始化为 0int 的零值)并且它永远不会改变.

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

1 <nil>

表示已成功扫描一项(distance)并且没有错误。

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