reader.ReadString 不会删除第一次出现的 delim

我写了一个简单的 go 程序,但它不能正常工作:


package main


import (

    "bufio"

    "fmt"

    "os"

)


func main() {

    reader := bufio.NewReader(os.Stdin)

    fmt.Print("Who are you? \n Enter your name: ")

    text, _ := reader.ReadString('\n')

    if aliceOrBob(text) {

        fmt.Printf("Hello, ", text)

    } else {

        fmt.Printf("You're not allowed in here! Get OUT!!")

    } 

}


func aliceOrBob(text string) bool {

    if text == "Alice" {

        return true

    } else if text == "Bob" {

        return true

    } else {

        return false

    }

}

它应该要求用户说出它的名字,如果他是 Alice 或 Bob,请向他打招呼,否则告诉他离开。问题是,即使输入的名字是 Alice 或 Bob,它也会告诉用户离开。


爱丽丝:


/usr/lib/golang/bin/go run /home/jcgruenhage/go/workspace/src/github.com/jcgruenhage/helloworld/greet/greet.go

Who are you? 

Enter your name: Alice

You're not allowed in here! Get OUT!!

Process finished with exit code 0

鲍勃:


/usr/lib/golang/bin/go run /home/jcgruenhage/go/workspace/src/github.com/jcgruenhage/helloworld/greet/greet.go

Who are you? 

Enter your name: Bob

You're not allowed in here! Get OUT!!

Process finished with exit code 0


红糖糍粑
浏览 183回答 3
3回答

眼眸繁星

这是因为您的text存储Bob\n解决此问题的一种方法是使用strings.TrimSpace修剪换行符,例如:import (    ....    "strings"    ....)...if aliceOrBob(strings.TrimSpace(text)) {...或者,您也可以使用ReadLine代替ReadString,例如:...text, _, _ := reader.ReadLine()if aliceOrBob(string(text)) {...需要 的原因string(text)是因为 ReadLine 会返回你byte[]而不是string.

繁星coding

我认为这里混乱的根源是:text, _ := reader.ReadString('\n')不删除\n,而是将其保留为最后一个值,并忽略它之后的所有内容。ReadString 读取直到输入中第一次出现 delim,返回一个字符串,其中包含直到并包括分隔符的数据。https://golang.org/src/bufio/bufio.go?s=11657:11721#L435然后你最终比较Alice和Alice\n。因此,正如@ch33hau 所指出的,解决方案是要么Alice\n在你的aliceOrBob函数中使用,要么以不同的方式读取输入。

慕哥9229398

我对 Go 一无所知,但您可能想要去掉前导或尾随空格和其他空格(制表符、换行符等)字符的字符串。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go