首页 > 解决方案 > 使用 bufio 读取 Go 中的一行后,如何使用 fmt.Scan 读取字符串?

问题描述

我用 读了一行bufio.NewReader(os.Stdin),然后用 读了一个字符串fmt.Scanf

package main

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

func main() {
    reader := bufio.NewReader(os.Stdin)
    
    var str string
    inp, _ := reader.ReadString('\n')
    fmt.Scanf("%s", &str)
    
    fmt.Println(inp)
    fmt.Printf(str)
}

输入:

This is a sentence.
John

我希望输出像上面那样,但事实并非如此。
输出:

This is a sentence.

实际上fmt.Scanf("%s", &str)不起作用。
问题是什么?我该如何解决?

标签: go

解决方案


reader.ReadString(delim) 读取直到 delim 的所有内容,包括分隔符。因此,它在两个输入之间添加了 \n。fmt.Printf(str) 最后没有 \n,所以第二个输出坚持打印到标准输出的下一个内容。

package main

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

func main() {
    reader := bufio.NewReader(os.Stdin)

    var str string
    inp, _ := reader.ReadString('\n')
    fmt.Scanf("%s", &str)

    fmt.Println(inp)
    fmt.Printf(str)
}

输入:

some line
John

输出:

some line

John

下面是按照您的意愿运行的代码。

   package main

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

func main() {
    reader := bufio.NewReader(os.Stdin)

    var str string
    inp, _ := reader.ReadString('\n')
    fmt.Scanf("%s", &str)

    fmt.Print(inp)
    fmt.Printf("%s\n", str)
}

在此处输入图像描述


推荐阅读