【问题标题】:Tell me what's wrong with this code GOLANG告诉我这段代码 GOLANG 有什么问题
【发布时间】:2019-02-19 07:53:25
【问题描述】:
package main

import (
    "fmt"
    "math"
)

func main() {

    distencecalc()
}

func distencecalc() {

    fmt.Println("X1 :")
    var x1 float64
    fmt.Scanf("%f", &x1)
    fmt.Print("")
    fmt.Println("Y1 :")
    var y1 float64
    fmt.Scanf("%f", &y1)
    fmt.Print("")
    fmt.Println("Z1 :")
    var z1 float64
    fmt.Scanf("%f", &z1)
    fmt.Print("")
    fmt.Println("X2 :")
    var x2 float64
    fmt.Scanf("%f", &x2)
    fmt.Print("")
    fmt.Println("Y2 :")
    var y2 float64
    fmt.Scanf("%f", &y2)
    fmt.Print("")

    fmt.Println("Z2 :")
    var z2 float64
    fmt.Scanf("%f", &z2)
    fmt.Print("")

    var Xcalc = x2 - x1
    var Ycalc = y2 - y1
    var Zcalc = z2 - z1



    var calcX = math.Pow(Xcalc, 2)
    var calcY = math.Pow(Ycalc, 2)
    var calcZ = math.Pow(Zcalc, 2)


    var allcalc = calcX + calcZ + calcY
    fmt.Println("the result is :")
    fmt.Println(math.Sqrt(allcalc))
}

问题是我编译然后运行它询问 x1 的程序我输入值并同时询问 y1 和 z1。

【问题讨论】:

  • 不要忽略Scanf返回的错误。

标签: go math printing


【解决方案1】:

实际上有问题的代码适用于 unix 系统,但通常问题是像 fmt.Scanf("%f", &x1) 这样的调用不会使用换行符,而是引用 fmt: Scanning 的包文档:

Scan、Fscan、Sscan 将输入中的换行符视为空格。

在 Windows 上,换行符不是单个 \n 字符,而是 \r\n,因此后续的 fmt.Scanf() 调用将立即进行,无需等待用户进一步输入。

因此,您必须在格式字符串中添加一个换行符以避免后续的fmt.Scanf() 调用才能继续:

fmt.Scanf("%f\n", &x1)

但更简单的方法是使用 fmt.Scanln() 并跳过整个格式字符串:

fmt.Scanln(&x1)

Scanln、Fscanln 和 Sscanln 在换行处停止扫描,并要求项目后跟换行符或 EOF。

扫描仪函数 (fmt.ScanXXX()) 会返回成功扫描的项目数和 error。要判断扫描是否成功,您必须检查其返回值,例如:

if _, err := fmt.Scanln(&x1); err != nil {
    fmt.Println("Scanning failed:", err)
}

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 2020-02-21
    • 2020-10-30
    • 2010-11-08
    • 2013-05-10
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多