Прочитать строку в golang

#go #reader

# #Вперед #считыватель

Вопрос:

Есть так много вариантов, чтобы сделать это в Go. Например:

 scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}
 

или

 reader := bufio.NewReader(os.Stdin)
text, _ := reader.ReadString('n')
 

Ни то, ни другое не работает в моем случае. Я не могу найти причину, по которой сканирование новой строки не работает.

Вот вопрос, над которым я работаю: https://www.hackerrank.com/challenges/30-dictionaries-and-maps

И вот мой код:

 package main
import (
    "fmt"
    "bufio"
    "os"
    "strings"
)

func main() {
    var count int
    fmt.Scan(amp;count)

    m := make(map[string]string)
    for i := 0; i<count; i  {
        reader := bufio.NewReader(os.Stdin)
        text,err := reader.ReadString('n')
        if err != nil {
           fmt.Println(err)
        }
        value := strings.Fields(text)
        m[value[0]] = value[1]
    }
    var names []string
    for i := 0; i<count; i  {
        var name string
        fmt.Scan(amp;name)
        names = append(names,name)
    }

    for j:= 0; j<len(names);j  {
        if m[names[j]] != ""{
            fmt.Println(names[j]  " = "  m[names[j]])
        }else{
            fmt.Println("Not found")
        }

    }

}
 

Он работает в моем редакторе, но когда я использую ввод вопроса, он не работает.

Комментарии:

1. В чем собственно проблема? Вы получаете сообщение об ошибке? Неверный вывод? (Если да, то какой ввод и какой неправильный вывод?)

2. Я заметил, что вы читаете только count запросы (после записей count телефонной книги), несмотря на то, что в вопросе говорится, что вы получите неизвестный номер. Не уверен, есть ли другие ошибки… было бы полезно, если бы вы рассказали нам, с какой проблемой вы столкнулись.

3. Еще одна проблема, которую я заметил: у вас есть пробелы вокруг = вашего вывода. (Вы будете выводить foo = 1234 вместо foo=1234 .)

4. Этот код также не компилируется (дополнительная правая скобка).

5. После проверки на платформе действительно отправляются какие-то странные строки, и strings.Split(...) функция иногда декодирует только пустой массив.

Ответ №1:

Как и было запрошено в комментариях, вот мой рабочий пример:

 package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    phonebook := make(map[string]int)

    var count int
    fmt.Scan(amp;count)
    for i := 0; i < count; i   {
        var name string
        var number int
        fmt.Scan(amp;name, amp;number)
        phonebook[name] = number
    }

    scanner := bufio.NewScanner(os.Stdin)
    for scanner.Scan() {
        name := scanner.Text()
        if number, ok := phonebook[name]; ok {
            fmt.Printf("%s=%dn", name, number)
        } else {
            fmt.Println("Not found")
        }
    }
}
 

Ответ №2:

Прежде всего, вы запускаете свой reader каждый раз в цикле.
Во-вторых, если вы используете Reader, придерживайтесь его. Вы инициализируете устройство чтения входных данных, затем пытаетесь вернуться к fmt.Scan, но Reader уже получил ваш ввод.
В-третьих, помните, что вам нужно для .Trim() вашего ввода

     package main

    import (
            "fmt"
    "bufio"
    "os"
    "strings"
    )

    func main() {
        var count int
        fmt.Scan(amp;count)
        reader := bufio.NewReader(os.Stdin)
        m := make(map[string]string)
        for i := 0; i<count; i  {

            text,err := reader.ReadString('n')
            if err != nil {
                fmt.Println(err)
            }
            value := strings.Fields(text)
            m[value[0]] = value[1]
        }
        var names []string
        for i := 0; i<count; i  {
            var name string
            name, _ = reader.ReadString('n')
            names = append(names,strings.Trim(name, " n"))
        }

        for _, name := range names {

            phone, found := m[name]
            if found {
                fmt.Println(name  "="  phone)
            }else{
                fmt.Println("Not found")
            }

        }

    }
 

Комментарии:

1. Спасибо! Он работает, но не работает в некоторых тестовых примерах. Вы можете проверить » hackerrank.com/challenges/30-dictionaries-and-maps »

2. Я здесь только для того, чтобы помочь прочитать строки в Go, а не для решения проблем с хакерранком 🙂