为什么Go中的fmt.Scanf不等待用户输入?

我正在阅读Caleb Doxsey的Go书,我对http://www.golang-book.com/4有两个疑问fmt.Scanf

我想知道为什么在第二个Scanf之后程序没有停止并等待用户输入?以及如何测试用户是否输入了整数和/或没有留空?

package main

import (

"fmt"

//"math"

)

// compute square roots by using Newton's method

func main() {

var x float64 //number to take square root

var y float64 //this is the guess

var q float64 //this is the quotient

var a float64 //this is the average

// how do check if the user entered a number

fmt.Print("Enter a number to take its square root: ")

var inputSquare float64

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

// why doesn't program stop after

// the Print statement and wait

// for user input?

fmt.Print("Enter first guess ")

var inputGuess float64

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

//x = 2

x = inputSquare

y = inputGuess

for i := 0; i < 10; i++ { //set up the for loop for iterations

q = x/y //compute the quotient; x and y are given

a = (q + y) / x //compute the average

y = a //set the guess to the average

} //for the next loop

fmt.Println("y --> ", y)

//fmt.Println("Sqrt(2)", math.Sqrt(2))

}

回答:

这是发行5391:fmtScanf拒绝\r\n在Windows上线的末端。

作为一种解决方法,要检查输入是否有效,请编写,

var inputSquare float64

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

if err != nil || n != 1 {

// handle invalid input

fmt.Println(n, err)

}

var inputGuess float64

n, err = fmt.Scanf("%f\n", &inputGuess)

if err != nil || n != 1 {

// handle invalid input

fmt.Println(n, err)

}

解决方法是"%f\n"格式字符串中的换行符。

fmt

功能扫描

func Scanf(format string, a ...interface{}) (n int, err error)

Scanf扫描从标准输入读取的文本,将连续的以空格分隔的值存储到由格式确定的连续的参数中。它返回成功扫描的项目数。

这是一个完整的工作程序:

package main

import (

"fmt"

)

// compute square roots by using Newton's method

func main() {

var x float64 //number to take square root

var y float64 //this is the guess

var q float64 //this is the quotient

var a float64 //this is the average

fmt.Print("Enter a number to take its square root: ")

var inputSquare float64

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

if err != nil || n != 1 {

// handle invalid input

fmt.Println(n, err)

return

}

fmt.Print("Enter first guess ")

var inputGuess float64

n, err = fmt.Scanf("%f\n", &inputGuess)

if err != nil || n != 1 {

// handle invalid input

fmt.Println(n, err)

return

}

x = inputSquare

y = inputGuess

for i := 0; i < 10; i++ {

q = x / y // compute the quotient; x and y are given

a = (q + y) / x // compute the average

y = a // set the guess to the average

}

fmt.Printf("sqrt(%g) = %g\n", x, y)

}

输出:

Enter a number to take its square root: 2.0

Enter first guess 1.0

sqrt(2) = 1.414213562373095

我在Windows 7上使用Go 1.1.1:

C:\>go version

go version go1.1.1 windows/amd64

以上是 为什么Go中的fmt.Scanf不等待用户输入? 的全部内容, 来源链接: utcz.com/qa/424754.html

回到顶部