我正在尝试一个基本的打印程序,它将重量和高度作为输入,并将它们打印在同一行中,没有任何空格或换行符。
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
?
1条答案
按热度按时间jdg4fx2g1#
您观察到的行为是由于终端输入缓冲的工作方式。当您使用bufio.NewReader(os.Stdin).ReadString('\n')读取用户的输入时,它将读取输入,直到并包括换行符('\n')。当您在输入高度后按Enter键时,它不仅捕获高度,还捕获换行符,后者包含在heightInput变量中。
因此,当您稍后使用fmt.Print(heightInput)时,它实际上是在打印换行符,这就是为什么您看不到任何可见输出的原因。相反,当硬编码字符串时,没有这个换行符,这就是为什么得到预期的输出。
要获得所需的输出,可以使用strings.TrimRight函数从输入字符串中删除换行符。下面是你可以修改你的代码的方法:
通过这种修改,无论是手动输入值还是硬编码,程序都将按预期工作。它从输入字符串的末尾修剪换行符('\n'),确保输出没有任何不需要的换行符。