Go语言 fmt.从终端阅读输入后,打印不按预期工作

hrirmatl  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(97)

我正在尝试一个基本的打印程序,它将重量和高度作为输入,并将它们打印在同一行中,没有任何空格或换行符。

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

var reader = bufio.NewReader(os.Stdin)

func main() {

    fmt.Println("BMI Calculator")
    fmt.Print("Please enter your weight (Kg): ")
    weightInput, _ := reader.ReadString('\n')
    fmt.Print("Please enter your height (m): ")
    heightInput, _ := reader.ReadString('\n')

    weightInput = strings.Replace(weightInput, "\n", "", -1)
    heightInput = strings.Replace(heightInput, "\n", "", -1)

    fmt.Print(weightInput)
    fmt.Print(heightInput)
}

例如,当我输入weight为70,height为1.8时,理想情况下应该打印701.8但在输入height后,我没有得到任何输出,程序在没有打印weightInput和heightInput的情况下完成执行(下面的程序输出:)

BMI Calculator
Please enter your weight (Kg): 70
Please enter your height (m): 1.8

但是,当我将最后两行更改为:

fmt.Println(weightInput)
fmt.Println(heightInput)

我在两个不同的行中得到正确的输出70和1.8,如下所示:

Please enter your weight (Kg): 70
Please enter your height (m): 1.8
70 
1.8

为什么fmt.Print函数不能正常工作?
我试着删除从用户那里获取输入的行,并将其替换为硬编码的字符串,如下所示:

package main

import (
    "fmt"
    "strings"
)

func main() {

    fmt.Println("BMI Calculator")
    weightInput := "70"
    heightInput := "1.8"

    weightInput = strings.Replace(weightInput, "\n", "", -1)
    heightInput = strings.Replace(heightInput, "\n", "", -1)

    fmt.Print(weightInput)
    fmt.Print(heightInput)
}

在这种情况下,我得到了想要的输出:

BMI Calculator
701.8

为什么fmt.Print在接受用户输入和硬编码字符串时的作用不同,以及在接受用户输入时如何正确使用fmt.Print

jdg4fx2g

jdg4fx2g1#

您观察到的行为是由于终端输入缓冲的工作方式。当您使用bufio.NewReader(os.Stdin).ReadString('\n')读取用户的输入时,它将读取输入,直到并包括换行符('\n')。当您在输入高度后按Enter键时,它不仅捕获高度,还捕获换行符,后者包含在heightInput变量中。
因此,当您稍后使用fmt.Print(heightInput)时,它实际上是在打印换行符,这就是为什么您看不到任何可见输出的原因。相反,当硬编码字符串时,没有这个换行符,这就是为什么得到预期的输出。
要获得所需的输出,可以使用strings.TrimRight函数从输入字符串中删除换行符。下面是你可以修改你的代码的方法:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

var reader = bufio.NewReader(os.Stdin)

func main() {
    fmt.Println("BMI Calculator")
    fmt.Print("Please enter your weight (Kg): ")
    weightInput, _ := reader.ReadString('\n')
    fmt.Print("Please enter your height (m): ")
    heightInput, _ := reader.ReadString('\n')

    weightInput = strings.TrimRight(weightInput, "\n")
    heightInput = strings.TrimRight(heightInput, "\n")

    fmt.Print(weightInput)
    fmt.Print(heightInput)
}

通过这种修改,无论是手动输入值还是硬编码,程序都将按预期工作。它从输入字符串的末尾修剪换行符('\n'),确保输出没有任何不需要的换行符。

相关问题