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

时间:2018-01-07 07:10:44

标签: go

我尝试通过scanner.Bytes快速输入,并且我转换为int。问题是:提供的输入是单行间隔元素(如数组),scanner.Bytes将其作为一个整体读取并将其转换为int。如何在读取的字节上使用Split功能!

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
}

3 个答案:

答案 0 :(得分:2)

默认的bufio.Scanner(使用默认的拆分功能)将输入分为线路终端剥离的行。如果要将输入分解为单词,则必须使用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值,表示扫描是否成功,您可以处理令牌。您应该使用此返回值,而不是依赖于用户输入有效数据。

答案 1 :(得分:1)

为什么不尝试像

这样的东西
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)
    }
}

答案 2 :(得分:1)

假设输入为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]