It seems that strings.split(" ") is not returning an array. I have no idea why this is. I'm sure I am using it in a similar context elsewhere.
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)
}
fmt.Scanln stops reading after the spaces.
Two Approaches to solve this Problem
1st Approach: USE Scanf
var in string
fmt.Scanf("%q", &in)
But then your input should be enclosed within the double quotes like "2 3"
2nd Approach: USE bufio
The best way I consider
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan(){
in = scanner.Text()
break //optional line if your input has a single line
}
fmt.Println(in)
This shall solve the problem in the best way
Scanln seemed to only read until a space so I solved this problem by using an extra string
fmt.Scanln(&in, &in1)
It is because fmt.Scanln
doesn't take inputs after first space so if you entered 2 3 4 at fmt.Scanln(&in)
then only 2 will be assigned to in.
Try using package bufio
:
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
in := scanner.Text()
wh = strings.Split(in, " ")
fmt.Println(wh[0])
fmt.Println(wh[1])