我正在阅读Caleb Doxsey的Go书,我对http://www.golang-book.com/4有两个疑问fmt.Scanf
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:fmt:Scanf拒绝\r\n在Windows上线的末端。
fmt
Scanf
\r\n
作为一种解决方法,要检查输入是否有效,请编写,
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"格式字符串中的换行符。
"%f\n"
包 fmt 功能扫描 func Scanf(format string, a ...interface{}) (n int, err error) Scanf扫描从标准输入读取的文本,将连续的以空格分隔的值存储到由格式确定的连续的参数中。它返回成功扫描的项目数。
包 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