strings.Split,stdin不返回切片/数组

时间:2017-04-15 00:55:11

标签: go

看来strings.split("")没有返回数组。我不知道为什么会这样。我确定我在其他地方的类似环境中使用它。

package main

import (
    "fmt"
    "strconv"
    "strings"
)

func main() {
    var seedCost float64
    var lawnNo int
    var in string
    var area float64
    var wh []string

    fmt.Scanln(&seedCost) //2 is inputted
    fmt.Scanln(&lawnNo)   //3
    lawnCost := 0.00

    for i := 0; i < lawnNo; i++ {
        fmt.Scanln(&in) //2 3 is inputted
        wh = strings.Split(in, " ")
        fmt.Println(wh[0])
        fmt.Println(wh[1]) //Test throwing exception, index out of range
        w, _ := strconv.ParseFloat(wh[0], 64)
        h, _ := strconv.ParseFloat(wh[1], 64) //EXCEPTIONAL LINE, index out of range

        area = w * h
        lawnCost += area * seedCost
    }

    ans := strconv.FormatFloat(lawnCost, 'E', 8, 64)
    fmt.Println(ans)
}

3 个答案:

答案 0 :(得分:1)

这是因为fmt.Scanln(&in)在第一个空格后没有输入,所以如果您在bufio输入2 3 4,则只会分配2个。

尝试使用包scanner := bufio.NewScanner(os.Stdin) scanner.Scan() in := scanner.Text() wh = strings.Split(in, " ") fmt.Println(wh[0]) fmt.Println(wh[1])

{{1}}

答案 1 :(得分:0)

Scanln似乎只读到空格,所以我通过使用额外的字符串解决了这个问题

fmt.Scanln(&in, &in1)

答案 2 :(得分:0)

fmt.Scanln在空格后停止阅读。

解决此问题的两种方法

第一种方法:使用Scanf

var in string
fmt.Scanf("%q", &in)

但是您的输入应该包含在"2 3"

之类的双引号中

第二种方法:使用bufio

我考虑的最佳方式

scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan(){
   in = scanner.Text()
   break  //optional line if your input has a single line
}
fmt.Println(in)

这将以最佳方式解决问题