为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 ReadLine() 获取字符串输入?

如何使用 ReadLine() 获取字符串输入?

Go
海绵宝宝撒 2023-07-17 17:50:41
我想从 stdio 获取字符串,func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)但我的代码无法正常工作。我倾向于 golang。我想知道如何从标准输入获取字符串ReadLine()我知道,fmt.Scan或者Scanner帮助我,但我想用ReadLine()package mainimport (        "bufio"        "fmt"        "io"        "os"        "strconv")var sc = bufio.NewScanner(os.Stdin)var rd = bufio.NewReaderSize(os.Stdin, 1000000)func nextInt() int {        sc.Scan()        i, e := strconv.Atoi(sc.Text())        if e != nil {                panic(e)        }        return i}func nextLine() string {        buf := make([]byte, 0, 1000000)        for {                line, isPrefix, err := rd.ReadLine()                if err == io.EOF {                        break                } else if err != nil {                        panic(err)                }                buf = append(buf, line...)                if !isPrefix {                        break                }        }        return string(buf)}func main() {        var s string        var a int        s = nextLine()        a = nextInt()        fmt.Println(s)        fmt.Println(a)}结果$ ./a.outtest # input334  # inputtest334$ cat in.txttest334$ ./a.out < in.txtpanic: strconv.Atoi: parsing "": invalid syntaxgoroutine 1 [running]:main.nextInt(0xc042056088)我预计两个输出应该是相同的,但是当我使用重定向时,它不起作用并得到不同的输出。
查看完整描述

2 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

摆脱扫描仪(您已经说过您更喜欢 ReadLine())并更改 nextInt() 函数以调用 nextLine(),如下所示:


func nextInt() int {

    i, e := strconv.Atoi(nextLine())

    if e != nil {

        panic(e)

    }

    return i

}

(顺便说一句,对错误的用户输入感到恐慌并不是一个好主意,但我认为这只是一个测试,您不会对生产代码这样做:)


查看完整回答
反对 回复 2023-07-17
?
catspeake

TA贡献1111条经验 获得超0个赞

你可以尝试不使用扫描仪,也许像这样 Readline 会为你获取数字,只需转换它


package main


import (

    "bufio"

    "fmt"

    "io"

    "os"

    "strconv"

)


var rd = bufio.NewReaderSize(os.Stdin, 1000000)


func nextLine() string {

    buf := make([]byte, 0, 1000000)

    for {

        line, isPrefix, err := rd.ReadLine()


        if err == io.EOF {

            break

        } else if err != nil {

            panic(err)

        }


        buf = append(buf, line...)


        if !isPrefix {

            break

        }

    }

    return string(buf)

}


func main() {

    var s string

    var a int


    s = nextLine()

    fmt.Println(s)

    s = nextLine()

    a, e := strconv.Atoi(s)

    if e != nil {

        panic(e)

    }

    fmt.Println(a)

}


查看完整回答
反对 回复 2023-07-17
  • 2 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信