Chciałbym odczytać standardowe dane wejściowe z wiersza poleceń, ale moje próby zakończyły się wyjściem programu przed wyświetleniem monitu o wprowadzenie danych. Szukam odpowiednika Console.ReadLine () w C #.
Oto, co obecnie mam:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)
fmt.Println("Enter text: ")
text2 := ""
fmt.Scanln(text2)
fmt.Println(text2)
ln := ""
fmt.Sscanln("%v", ln)
fmt.Println(ln)
}
bufio
buforowania żadnego czytnika (np.bufio.NewReader(os.Stdin)
) Z bezpośrednimi odczytami z podkreślającego czytnika (np.fmt.Scanln(x)
Bezpośrednio zos.Stdin
). Buforowanie może być odczytywane dowolnie daleko w przód. (W tym konkretnym przypadku później należyfmt.Fscanln(reader,x)
odczytać z tego samego bufora).fmt.Sscanln
prac, po uruchomieniu staje się „% v”Odpowiedzi:
Nie jestem pewien, co jest nie tak z blokiem
Jak to działa na moim komputerze. Jednak do następnego bloku potrzebujesz wskaźnika do zmiennych, do których przypisujesz dane wejściowe. Spróbuj wymienić
fmt.Scanln(text2)
zfmt.Scanln(&text2)
. Nie używajSscanln
, ponieważ analizuje ciąg znaków już w pamięci zamiast ze standardowego wejścia. Jeśli chcesz zrobić coś takiego, co próbujesz zrobić, zastąp tofmt.Scanf("%s", &ln)
Jeśli to nadal nie działa, twoim winowajcą mogą być jakieś dziwne ustawienia systemowe lub błędne IDE.
źródło
ReadString('\n')
czyReadString("\n")
?rd
do zmiennejs
jakoif s,_ = rd.ReadString('\n'); true { s = strings.Trim(s, " \n") }
cannot use "\n" (type string) as type byte in argument to reader.ReadString
możesz również spróbować:
źródło
fmt.Println(scanner.Err())
poniżej pętli for.Myślę, że bardziej standardowym sposobem na to byłoby:
Spójrz na
scan
godoc: http://godoc.org/fmt#Scanźródło
stops scanning at a newline and after the final item there must be a newline or EOF
nie jestem pewien, dlaczego przestrzeń go „łamie” ... Myślę, że to błądfmt.Scanln
ifmt.Scan
bieżącej wersji go 2016 (wersja go1.6.2 linux / amd64).Zawsze staraj się używać bufio.NewScanner do zbierania danych wejściowych z konsoli. Jak wspomniano inni, istnieje wiele sposobów wykonania zadania, ale skaner pierwotnie miał na celu wykonanie zadania. Dave Cheney wyjaśnia, dlaczego warto używać skanera zamiast bufio.Reader's ReadLine.
https://twitter.com/davecheney/status/604837853344989184?lang=en
Oto odpowiedź na fragment kodu dla twojego pytania
Jeśli nie chcesz programowo zbierać danych wejściowych, po prostu dodaj te wiersze
Wyjście powyższego programu będzie:
Powyższy program zbiera dane wejściowe użytkownika i zapisuje je w tablicy. Możemy również przerwać ten przepływ specjalnym charakterem. Skaner zapewnia interfejs API do zaawansowanych zastosowań, takich jak dzielenie przy użyciu funkcji niestandardowej itp., Skanowanie różnych typów strumieni we / wy (Stdin, String) itp.
źródło
Innym sposobem odczytu wielu danych wejściowych w pętli, które mogą obsłużyć dane wejściowe ze spacjami:
Wynik:
źródło
Jestem spóźniony na przyjęcie. Ale co powiesz na jedną wkładkę:
i naciśnij ctrl + d (EOT) po wprowadzeniu danych w wierszu poleceń.
źródło
os.Stdin
nie kończy się, nie można przeczytać wszystkiego. Być może czekasz chwilę ...mail
.Wypróbuj ten kod: -
źródło
Scanf()
że nie akceptuje białych znaków w łańcuchuMożna to również zrobić w następujący sposób:
źródło
Wyczyść kilka podpowiedzi:
Oto przebieg:
źródło
Musisz podać wskaźnik do zmiennej, którą chcesz skanować, na przykład:
źródło
W moim przypadku program nie czekał, ponieważ użyłem
watcher
polecenia do automatycznego uruchomienia programu. Ręczne uruchomienie programugo run main.go
spowodowało „Wprowadź tekst” i ostatecznie drukowanie na konsoli.źródło
Scan*
rodziny jest to, że czytają do separatora białych znaków (np. Spacji).