Go 为什么';t fmt.Scanf进入等待用户输入?

Go 为什么';t fmt.Scanf进入等待用户输入?,go,Go,我正在阅读Caleb Doxsey的围棋书,我有两个关于fmt.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

我正在阅读Caleb Doxsey的围棋书,我有两个关于
fmt.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))
}
主程序包
进口(
“fmt”
//“数学”
)
//用牛顿法计算平方根
func main(){
var x float64//要取平方根的数字
var y float64//这是猜测
var q float64//这是商
var a float64//这是平均值
//如何检查用户是否输入了数字
fmt.Print(“输入一个取其平方根的数字:”)
var输入平方浮点64
格式扫描(“%f”、&inputSquare)
//为什么程序在结束后不停止
//打印语句并等待
//用于用户输入?
格式打印(“输入第一个猜测”)
var Input64
fmt.Scanf(“%f”,&inputGuess)
//x=2
x=输入平方
y=输入猜测
for i:=0;i<10;i++{//为迭代设置for循环
q=x/y//计算商;x和y已给出
a=(q+y)/x//计算平均值
y=a//将猜测设置为平均值
}//用于下一个循环
fmt.Println(“y-->”,y)
//fmt.Println(“Sqrt(2)”,数学Sqrt(2))
}
它是:
fmt
Scanf
在Windows上拒绝
\r\n

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

var inputSquare float64
n, err := fmt.Scanf("%f\n", &inputSquare)
if err != nil || n != 1 {
    // handle invalid input
    fmt.Println(n, err)
}

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

包装
fmt

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)
}
我在Windows 7上使用Go 1.1.1:

C:\>go version
go version go1.1.1 windows/amd64  

这对我来说很合适。我猜这是一个行尾问题。如果您在Windows上运行,行结尾通常用“\r\n”表示,而在Mac OS X和Linux上(我在这里测试过),它只是“\n”。我的猜测是,Go可能正在读取'\r',将其视为一行结尾,并将'\n'留在流中。因此,当您再次调用fmt.Scanf时,缓冲区中已经有一些内容,无需阻塞。不过这只是一个猜测。有什么建议可以解决吗?这是我在Windows命令行中运行的命令:c:\Go\src\play\exercise>Go-run-loop\u exercise.Go输入一个数字取其平方根:2输入first guess y-->+INF如果使用Scanf调用显式读取换行符会发生什么?比如“
fmt.Scanf(“%f\n”,&inputGuess)
”?或者,您可以在每次读取后刷新stdin。我不太清楚如何告诉您在哪里查找刷新功能。是的,添加
\n
解决了此问题。谢谢。
fmt.Scanf()
是否返回错误?我假设,
n
是输入,
err
n,err:=fmt.Scanf(“%f\n”,&inputSquare)
中可能的错误消息。这是否正确?请参阅我的修订答案
n
是成功扫描的项目数,
err
报告扫描过程中遇到的任何错误。因此,如果出现错误或扫描的项目数量不是您期望的(
err!=nil | | n!=1
),请采取措施处理错误。但是,如果一切顺利(
err==nil&&n==1
),则可以从
*inputSquare
读取作为浮点数(
float64
)的有效输入。在你的代码中,你丢弃了
n
err
,这就是你没有注意到错误的原因。我一定是做错了什么。如果我使用错误处理部分
n运行程序,err:=fmt.Scanf(“f\n”、&inputSquare)//如果出错,则拾取错误!=零| | n!=1{fmt.Println(n,err)
如果我注释掉错误,我会得到“0输入与格式不匹配”(例如,我输入2.0表示inputSquare),处理它一切正常!我做错了什么?我修改了答案,提供了一个完整的工作程序。当你运行程序时,你会得到什么输出?
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
C:\>go version
go version go1.1.1 windows/amd64