繁体   English   中英

快速输入方法,用空格分隔[Golang]

[英]Fast method to take input separated by space [Golang]

我正在尝试通过scanner.Bytes快速输入,然后将其转换为int。 问题是:提供的输入是由单行分隔的元素(例如数组)和scanner.Bytes将其整体读取并将其转换为int。 如何对读取的字节使用拆分功能!

func main()  {
    scanner := bufio.NewScanner(os.Stdin)
    var t int
    fmt.Scanf("%d", &t)

    for o := 0; o < t; o++ {
        scanner.Scan()
        //scanner.Split(bufio.ScanWords())
        val := toInt(scanner.Bytes())
        fmt.Println(val)
    }
}

func toInt(buf []byte) (n int) {
    for _, v := range buf {
        n = n*10 + int(v-'0')
    }
    return
}

默认的bufio.Scanner (具有默认的split功能)将输入分成几行,剥去了行终端。 如果要将输入分解为单词,则必须使用Scanner.Split()方法设置其他拆分功能。

有一个现成的拆分函数可用于拆分单词: bufio.ScanWords() 我们可以在您的代码中看到此函数的注释。

但是要知道Scanner.Split()方法需要一个函数值 您不需要调用split函数,扫描仪将调用它来中断输入数据。 您只需要传递函数值即可,而无需调用它,也不必在函数名称后附加() ,例如:

scanner.Split(bufio.ScanWords)

还要注意,在开始扫描输入之前,您只需要执行一次,并且只能执行一次,因此请将此行移至for循环上方:

var t int
fmt.Scanf("%d", &t)

scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
for o := 0; o < t; o++ {
    scanner.Scan()
    val := toInt(scanner.Bytes())
    fmt.Println(val)
}

现在运行该应用程序,并输入以下行:

3
1 2 3

输出将是:

1
2
3

还要注意, Scanner.Scan()返回一个bool值,指示扫描是否成功,您可以处理令牌。 您应该使用此返回值,而不要依赖用户输入有效数据。

为什么不尝试像

func main()  {
    scanner := bufio.NewScanner(os.Stdin)

    for scanner.Scan() {
        val, err := strconv.Atoi(scanner.Text())
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(val)
    }
}

假设输入是3 65 65 653是以下字节数,则可以这样做:

func main() {
    var t int
    fmt.Scanf("%d", &t)
    values := make([]byte, t)
    buf := make([]interface{}, t)
    for i := 0; i < t; i++ {
        buf[i] = &values[i]
    }
    fmt.Scanln(buf...)

    // test
    fmt.Printf("%v\n", values)
}

测试输出为[65 65 65]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM