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

如何在单独的函数中编写扫描仪以使其工作?

如何在单独的函数中编写扫描仪以使其工作?

Go
蝴蝶不菲 2023-02-06 18:38:14
在此代码中,我创建了一个函数,该函数TakeInput()也将接受用户输入,包括空格。但每当我运行此代码并输入姓名和学校名称时,它都会为我打印数据。尽管如果我写的scanner没有任何功能,它会获取带有空格的数据。package mainimport (    "bufio"    "fmt"    "os")func TakeInput(value string) {    scanner := bufio.NewScanner(os.Stdin)    if scanner.Scan() {        value = scanner.Text()    }    if err := scanner.Err(); err != nil {        fmt.Println("Error encountered:", err)    }}func main() {    var name, school string    fmt.Printf("Enter your name: ")    TakeInput(name)    fmt.Printf("Enter your school name: ")    TakeInput(school)    fmt.Println(name, school)}
查看完整描述

1 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

每个参数都是函数内部的本地副本。您必须将指针传递给TakeInput()(例如&name和&school)并修改指向的值(例如*value = scanner.Text(),否则您只修改函数返回时丢弃的副本。


例如:


func TakeInput(value *string) {

    scanner := bufio.NewScanner(os.Stdin)

    if scanner.Scan() {

        *value = scanner.Text()

    }


    if err := scanner.Err(); err != nil {

        fmt.Println("Error encountered:", err)

    }

}


func main() {

    var name, school string

    fmt.Printf("Enter your name: ")

    TakeInput(&name)


    fmt.Printf("Enter your school name: ")

    TakeInput(&school)


    fmt.Println(name, school)

}

还要注意bufio.Scanner有一个内部缓冲区。它可能读取的内容多于返回的内容,当您bufio.Scanner在另一个TakeInput()调用中创建新的内容时,它可能无法读取以前读取、缓冲和丢弃的数据。


所以在外部创建扫描仪TakeInput(),例如


func TakeInput(scanner *bufio.Scanner, value *string) {

    if scanner.Scan() {

        *value = scanner.Text()

    }


    if err := scanner.Err(); err != nil {

        fmt.Println("Error encountered:", err)

    }

}


func main() {

    scanner := bufio.NewScanner(os.Stdin)


    var name, school string

    fmt.Printf("Enter your name: ")

    TakeInput(scanner, &name)


    fmt.Printf("Enter your school name: ")

    TakeInput(scanner, &school)


    fmt.Println(name, school)

}


查看完整回答
反对 回复 2023-02-06
  • 1 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

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