我学习Go并且作为一个初始项目,我正在尝试Learntris挑战。
在这里,您必须从stdin获取由换行符分隔的输入。我一直在阅读有关读者与扫描仪的内容,以及扫描仪对大多数事物的适当抽象程度。
我在这里使用扫描仪来检查单个字符命令以及命令' g'我需要阅读由' \ n'分隔的22行。我认为我处理扫描仪的方式可能是错误的,因为我一直在接收空数组。我的代码可以在这里看到:
package main
import (
"fmt"
"bufio"
"os"
"learntris/internal/pkg/matrix"
)
func main() {
board := matrix.Create_mat()
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
text := scanner.Text()
char := text[0]
switch {
case char == 'q':
//quit
os.Exit(3)
case char == 'p':
//print the state of the matrix
matrix.Print_mat(board)
case char == 'g':
given(&board)
matrix.Print_mat(board)
default:
//still quit
fmt.Println("case not hit")
os.Exit(3)
}
}
}
func given(board *([][]rune)) {
scanner := bufio.NewScanner(os.Stdin)
i := 0
for scanner.Scan() {
if i == 21 { break} //only read 22 lines
fmt.Println(scanner.Text())
//will modify board here once scanner is sorted out
i++
}
}
更新了给定的功能:
func given(board *([][]rune)) {
//fmt.Println("got to given")
//expecting 22 lines of 10 items separated by spaces
scanner := bufio.NewScanner(os.Stdin)
i := 0 //my iterator for num lines(rows)
for scanner.Scan() {
//fmt.Println("scanning")
text := scanner.Text()
if len(text) >= 10{
//fmt.Println(text)
//need to split and throw away spaces
split_line := strings.Split(text, " ")
for j, j_str := range(split_line){
(*board)[i][j] = rune(j_str[0])
}
i++
}
if i == 22 {break} //stop at 22 lines
}
}
这可以采取如下输入:
g
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
m m m m m m m m m m
b b b b b b b b b b
c c c c c c c c c c
g g g g g g g g g g
y y y y y y y y y y
o o o o o o o o o o
r r r r r r r r r r
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
c . . . . . . . . .
c . . . . . . . . .
c . . . . g . . . .
c . . o . g g . . .
. . . o . b g . . .
. m r r o o b y y .
m m m r r b b y y .
p
q
通过标准输入。当手动复制并粘贴到程序输入时,它可以正常工作,但是当通过./learntris<给出相同的文本时。 input.txt,它将在switch case中以默认值着陆,并且永远不会通过给定的矩阵接收。
我认为问题在于手动输入和标准输出之间的差异,但我不确定应该改变什么。
最终编辑:
func given(board *([][]rune), scanner *bufio.Scanner) {
//expecting 22 lines of 10 items separated by spaces
i := 0 //my iterator for num lines(rows)
for scanner.Scan() {
text := scanner.Text()
if len(text) >= 10{
//fmt.Println(text)
//need to split and throw away spaces
split_line := strings.Split(text, " ")
for j, j_str := range(split_line){
(*board)[i][j] = rune(j_str[0])
}
i++
}
if i == 22 {break} //stop at 22 lines
}
if scanner.Err() != nil{
fmt.Println(scanner.Err())
}
}
通过将扫描仪传入该功能,扫描仪不再失去预期的位置,并且没有尝试使用矩阵作为下一个命令。