Заполнение динамического массива c консоли
Столкнулся с проблемой, что не могу ввести с консоли значения для двумерного массива. В GOlang я новичок, ранее писал на плюсах. Не могу понять в чём ошибка. Может кто подсказать ?
package main
import "fmt"
var BinTree [200000][3]int
func main() {
var size int
fmt.Scanf("%v", &size)
for i := 0; i < size; i++ {
fmt.Scanf("%v %v %v", &BinTree[i][0], &BinTree[i][1], &BinTree[i][2])
}
for i := 0; i < size; i++ {
fmt.Printf("%v %v %v \n", BinTree[i][0], BinTree[i][1], BinTree[i][2])
}
}
Ввожу:
6
-2 0 2
8 4 3
9 0 0
3 5 6
0 0 0
6 0 0
Ответы (1 шт):
Первое, что нужно освоить в Go - обработка ошибок. Это не С++, здесь исключения (почти) не выбрасывают.
Вместо fmt.Scanf("%v %v %v", &BinTree[i][0], &BinTree[i][1], &BinTree[i][2]) вам следовало написать что-то вроде
_, errr := fmt.Scanf("%v %v %v", &BinTree[i][0], &BinTree[i][1], &BinTree[i][2])
if err != nil {
panic(err)
}
И тогда вы бы сразу увидели, что пошло не так:
panic: unexpected newline
Другими словами, конец строки fmt.Scanf обрабатывает особым образом. В строке ввода обязательно должен присутствовать символ \n, только в этом случае Scanf будет читать из следующей строки. Так же символ \n означает EOF. Вам достаточно читать как fmt.Scanf("%v\n", &size) и fmt.Scanf("%v %v %v\n", &BinTree[i][0], &BinTree[i][1], &BinTree[i][2])
Пример: https://go.dev/play/p/trhNHhYb_kx
Замечание к стилю. Вам не нужно аллоцировать массив BinTree. Функция append при необходимости аллоцирует достаточно памяти, чтобы нарастить этот массив на очередные три целых.
var BinTree [][]int
func main() {
...
for i := 0; i < size; i++ {
var v1, v2, v3 int
_, err = fmt.Fscanf(reader, "%v %v %v\n", &v1, &v2, &v3)
if err != nil {
panic(err)
}
BinTree = append(BinTree, []int{v1, v2, v3})
}
...
}
Полный пример: https://go.dev/play/p/BJnRiIxWijT