#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, а не для решения проблем с хакерранком 🙂