Go语言 bufio.NewReader(os.Stdin)和fmt.Scanln()之间有什么区别[已关闭]

kkbh8khc  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(289)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题吗?**通过editing this post添加详细信息并阐明问题。

三年前就关门了。
Improve this question

package main

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

func main() {
    in := bufio.NewReader(os.Stdin)
    fmt.Println("Please input S: ")
    S, _ := in.ReadString('\n')
    fmt.Println("Please input J: ")
    J, _ := in.ReadString('\n')
    sum := numJewelsInStones(J,S)
    fmt.Println(sum)
}

func numJewelsInStones(J string, S string) int {
    var sum  int
    for _, s := range S {
        for _, j := range J{
            if s ==j {
                sum ++
            }
        }

    }
    return sum
}

当我在终端输入“hello”和“h”时.这个程序将打印2,但预期是1。
如果我用fmt.Scanln(),结果是1.
是什么导致了这一结果?

dgtucam1

dgtucam11#

它们是完全不同的,而且大部分是不相关的。
bufio.NewReader()“ Package 一个io.Reader或io.Writer对象,创建另一个对象(Reader或Writer),该对象也实现接口,但为文本I/O提供缓冲和一些帮助。
换句话说,它所做的 * 全部 * 就是在os.Stdin上添加一个缓冲层(在您的示例中),它根本不对流进行解析或解释。
相比之下,fmt.Scanln()从流中读取数据(该数据流可能被缓冲,也可能没有缓冲--即由bufio包返回),通过空格分割输入,将其存储在切片中。
通过阅读文档(我在上面已经链接到了),你可以了解每一个的具体细节。但是对于你的问题“有什么区别?”的直接答案是“绝对的一切。它们实际上没有任何共同之处,尽管它们可以一起使用。”

相关问题