2016-10-14 2 views
1

Есть так много вариантов сделать это в Go. Например:Читать строку в golang

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(&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(&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") 
     } 

    } 

} 

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

+2

Что фактический вопрос? Вы получаете сообщение об ошибке? Неверный выход? (Если да, то какой ввод и что не так получается?) – smarx

+0

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

+0

Другая проблема, которую я заметил: у вас есть пробелы вокруг '=' в вашем выпуске. (Вы выведете 'foo = 1234' вместо' foo = 1234'.) – smarx

ответ

1

В соответствии с просьбой в комментариях, здесь был мой рабочий пример:

package main 

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

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

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

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

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

package main 

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

    func main() { 
     var count int 
     fmt.Scan(&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") 
      } 

     } 

    } 
+0

Спасибо! Он работает, но не работает в некоторых тестовых случаях. Вы можете проверить «https://www.hackerrank.com/challenges/30-dictionaries-and-maps» –

+1

Я здесь, чтобы помочь читать строки в Go, а не решать проблемы HackerRank :) –

Смежные вопросы