为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
杨魅力 2021-06-17 09:05:01
我正在阅读 Caleb Doxsey 的 Go 书,我有两个关于http://www.golang-book.com/4 的问题fmt.Scanf我想知道为什么程序在第二次 Scanf 之后没有停止并等待用户输入?以及如何测试用户是否输入了整数和/或没有留空?package mainimport ("fmt"//"math")// compute square roots by using Newton's methodfunc main() {var x float64           //number to take square rootvar y float64           //this is the guessvar q float64           //this is the quotientvar a float64           //this is the average// how do check if the user entered a numberfmt.Print("Enter a number to take its square root: ")var inputSquare float64fmt.Scanf("%f", &inputSquare)// why doesn't program stop after // the Print statement and wait// for user input?fmt.Print("Enter first guess ")var inputGuess float64fmt.Scanf("%f", &inputGuess)//x = 2x = inputSquarey = inputGuessfor 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 loopfmt.Println("y --> ", y)//fmt.Println("Sqrt(2)", math.Sqrt(2))}
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

这是发行5391:fmt:Scanf拒绝\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  


查看完整回答
反对 回复 2021-06-21
  • 1 回答
  • 0 关注
  • 230 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信