【问题标题】:Loop prints statement multiple times when entering multiple letters as input - GoLang [duplicate]输入多个字母作为输入时循环多次打印语句 - GoLang [重复]
【发布时间】:2021-08-26 04:28:18
【问题描述】:

我是 GoLang 的新手,我遇到的问题是,如果我输入多个字母作为输入,结果会打印多次。

用户需要输入一个非 0 且非字母的数字。 如果您键入一个字母,变量“num1”将为“0”(通过打印变量进行检查)

如果用户输入“0”或字母,他将再次尝试输入数字。

示例: 如果我键入“d”,它将按原样打印一次。 如果我输入“dd”,它将打印两次。 如果我输入“ddd”,它将打印三遍。 但是,如果我输入“0”或“00”,它将只打印一次。

我怎样才能做到这样,如果我输入多个字母,结果总是会打印一次?

代码:

package main

import "fmt"

func main() {

    var num1 float64

    for {

        fmt.Print("\nFirst Number: ")
        fmt.Scanln(&num1)

        if num1 == 0 {
            fmt.Print("Invalid input for 'First Number'")

        } else {
        break
        }
    }
    fmt.Print("passed")
} 

PS:如果可能,变量 num1 应保持为 'float64'

感谢您的帮助^^

【问题讨论】:

  • 刚开始,你应该注意fmt.Scanln返回的错误值。

标签: loops go printing numbers var


【解决方案1】:

您面临的问题是 fmt.Scan 无法将字符串转换为浮点数时,未扫描的位仍保留在缓冲区中。您可以尝试通过实际读取和忽略它来清除缓冲区。

func main() {
    var num1 float64
    stdin := bufio.NewReader(os.Stdin)

    for {

        fmt.Print("\nFirst Number: ")
        fmt.Scan(&num1)
        if num1 == 0 {
            stdin.ReadString('\n')
            fmt.Print("Invalid input for 'First Number'")
        } else {
            break
        }
    }

    fmt.Print("passed")
}

我会推荐另一种方法来手动解析来自字符串的浮点数,如下所示:

func main() {
    var num1 float64

    for {
        var input string
        var err error

        fmt.Print("\nFirst Number: ")
        fmt.Scan(&input)
        num1, err = strconv.ParseFloat(input, 64)
        if err != nil {
            fmt.Print("Invalid input for 'First Number'")
        }

        if num1 == 0 {
            fmt.Print("Invalid input for 'First Number'")
        } else {
            break
        }
    }

    fmt.Print("passed")
}

并始终确保阅读并理解错误。

【讨论】:

    猜你喜欢
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多