看来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)
}
答案 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)
这将以最佳方式解决问题