为什么Scanf()函数对我来说无法正常工作?

huangapple go评论90阅读模式
英文:

Why doesn't Scanf() work correctly for me?

问题

我正在尝试从Python转向Go语言,并且在我有限的知识下,我试图制作一个基本的计算器。然而,由于某种原因,我无法正确使用Scanf函数。它似乎只接受第一个scanf,而完全忽略了第二个scanf。

package main

import (
	"fmt"
)

var x int
var y int
var result int
var input float64

func add(x int, y int) int {
	sum := x + y
	return sum
}

func sub(x int, y int) int {
	sum := x - y
	return sum
}

func div(x int, y int) int {
	sum := x / y
	return sum
}

func mul(x int, y int) int {
	sum := x * y
	return sum
}

func main() {

	fmt.Println("Which type?\n1: Add\n2: Subtract\n3: Divide\n4: Multiply")
	fmt.Scanf("%d", &input)

	fmt.Println("Input numbers separated by space")
	fmt.Scanf("%d", &x, &y)

	switch input {
	case 1:
		result = add(x, y)

	case 2:
		result = sub(x, y)

	case 3:
		result = div(x, y)

	case 4:
		result = mul(x, y)
	}

	fmt.Println(result)
}

以上是你提供的代码。

英文:

I'm trying to move from Python to GO and with my minimal knowledge I tried to make a basic calculator. However i for some reason can't get Scanf to work properly. It only seems to accept the first scanf but the second one is completely ignored

package main

import (
	"fmt"
)

var x int
var y int
var result int
var input float64

func add(x int, y int) int {
sum := x + y
return sum
}

func sub(x int, y int) int {
    sum := x - y
    return sum
}

func div(x int, y int) int {
    sum := x / y
    return sum
}

func mul(x int, y int) int {
sum := x * y
return sum
}

func main() {

	fmt.Println("Which type?\n1: Add\n2: Subtract\n3: Divide\n4: 
    Multiply")
    fmt.Scanf("%d", &input)

    fmt.Println("Input numbers seperated by space")
    fmt.Scanf("%d", x, y)

    switch input {
    case 1:
    	result = add(x, y)

    case 2:
    	result = sub(x, y)

    case 3:
	    result = div(x, y)

    case 4:
	   result = mul(x, y)
    }

    fmt.Println(result)
}

答案1

得分: 0

第二次调用Scanf函数,Scanf("%d", x, y)只提供了一个转换说明符,但给出了两个变量。

此外,这次调用只传递了变量的值,而不是它们的地址。

正确的调用应该是Scanf("%d %d", &x, &y)


在第一次调用Scanf时,你说:Scanf("%d", &input)。第二个参数的语法& variable表示对命名变量的引用

input被声明为全局变量,但只有在它的声明之后才可见。由于inputmain函数内部是可见的,但在Scanf函数内部不可见,为了让Scanf函数能够改变另一个作用域中的值,必须将其地址作为参数传递,而不是它的值。

地址的接收者(在这里是Scanf函数)可以在仍然在作用域内的帧中更改变量的值;在这种情况下,是main函数。

请参阅Go语言的文档以获取类似的解释:https://golang.org/ref/spec#Address_operators

英文:

The second call to Scanf, Scanf("%d", x, y) only provides one conversion specifier but was given two variables.

Moreover, this second call only passes the variables' values, not their addresses.

It seems the correct call would be Scanf("%d %d", &x, &y)


In the first call to Scanf you said: Scanf("%d", &input). The second argument's syntax, & variable, denotes a reference to the named variable.

input was declared global, but is only visible after its declaration. Since input is in scope within main but not within Scanf, in order for Scanf to change the value in another scope, the address must be given as an argument, rather than its value.

The recipient of the address (here Scanf) can then change the value of the variable in the frame in which it is still in scope; in this case, main.

See Go's documentation for a similar explanation: https://golang.org/ref/spec#Address_operators

huangapple
  • 本文由 发表于 2017年9月3日 23:00:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/46024718.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定