问题
There are so many option to do this in Go. For example:
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
or
reader := bufio.NewReader(os.Stdin)
text, _ := reader.ReadString('\n')
Neither is working in my case. I am unable to find the reason why new line scan is not working.
Here's the question I'm working on: https://www.hackerrank.com/challenges/30-dictionaries-and-maps
And here's my code:
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")
}
}
}
It is working in my editor, but when I use the question's input, it doesn't work.
回答1:
As requested in the comments, here was my working example:
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")
}
}
}
回答2:
First of all, you initiate your reader each time in a loop.
Second, if you go with Reader, stick with it. You initialize input reader, then try to go back to fmt.Scan, but Reader already got your input.
Third, remember that you need to .Trim()
your input
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")
}
}
}
来源:https://stackoverflow.com/questions/40035635/read-line-in-golang