为什么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
用于扫描浮点数,但是你的变量distance
是int
类型的,所以你应该使用%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
变量被初始化为 0
(int
的零值)并且它永远不会改变.
如果扫描成功,您会看到以下输出:
1 <nil>
表示已成功扫描一项(distance
)并且没有错误。
如果您要通过一次 Scanf()
调用扫描多个项目,当然 n
可能大于 1
(例如 fmt.Scanf("%f %d", &distance, &temp)
)。
我正在尝试从用户那里获取输入并将其打印出来,但在我进行了一些输入后,距离的值显然是 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
用于扫描浮点数,但是你的变量distance
是int
类型的,所以你应该使用%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
变量被初始化为 0
(int
的零值)并且它永远不会改变.
如果扫描成功,您会看到以下输出:
1 <nil>
表示已成功扫描一项(distance
)并且没有错误。
如果您要通过一次 Scanf()
调用扫描多个项目,当然 n
可能大于 1
(例如 fmt.Scanf("%f %d", &distance, &temp)
)。