在没有OEF的情况下使用扫描仪读取stdin

时间:2018-02-17 16:24:10

标签: go

我学习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())
    }

}

通过将扫描仪传入该功能,扫描仪不再失去预期的位置,并且没有尝试使用矩阵作为下一个命令。

0 个答案:

没有答案