Ich möchte die Standardeingabe über die Befehlszeile lesen, aber meine Versuche wurden mit dem Beenden des Programms beendet, bevor ich zur Eingabe aufgefordert werde. Ich suche das Äquivalent von Console.ReadLine () in C #.
Folgendes habe ich derzeit:
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
Pufferung eines Lesegeräts (z. B.bufio.NewReader(os.Stdin)
) nicht mit direkten Lesevorgängen vom unterstrichenen Lesegerät (z. B.fmt.Scanln(x)
direkten Lesevorgängen vonos.Stdin
). Die Pufferung kann beliebig weit voraus gelesen werden. (In diesem speziellen Fall sollte dasfmt.Fscanln(reader,x)
letztere aus demselben Puffer gelesen werden).fmt.Sscanln
Arbeiten, es wird "% v" nach dem LaufenAntworten:
Ich bin mir nicht sicher, was mit dem Block los ist
Wie es auf meiner Maschine funktioniert. Für den nächsten Block benötigen Sie jedoch einen Zeiger auf die Variablen, denen Sie die Eingabe zuweisen. Versuchen Sie es
fmt.Scanln(text2)
durchfmt.Scanln(&text2)
. Nicht verwendenSscanln
, da eine Zeichenfolge analysiert wird, die sich bereits im Speicher befindet, anstatt von stdin. Wenn Sie so etwas wie das tun möchten, was Sie versucht haben, ersetzen Sie es durchfmt.Scanf("%s", &ln)
Wenn dies immer noch nicht funktioniert, liegt Ihr Schuldiger möglicherweise an seltsamen Systemeinstellungen oder einer fehlerhaften IDE.
quelle
ReadString('\n')
oderReadString("\n")
?rd
zu Variable zu lesens
alsif s,_ = rd.ReadString('\n'); true { s = strings.Trim(s, " \n") }
cannot use "\n" (type string) as type byte in argument to reader.ReadString
Sie können auch versuchen:
quelle
fmt.Println(scanner.Err())
unter der for-Schleife hinzuzufügen .Ich denke, ein normaler Weg, dies zu tun, wäre:
Schauen Sie sich den
scan
Godoc an: http://godoc.org/fmt#Scanquelle
stops scanning at a newline and after the final item there must be a newline or EOF
ich nicht sicher bin, warum der Weltraum es "kaputt macht" ... Ich denke, es ist ein Fehlerfmt.Scanln
undfmt.Scan
mit der aktuellen 2016 go-Version (go-Version go1.6.2 linux / amd64) bestehen.Versuchen Sie immer, den bufio.NewScanner zum Sammeln von Eingaben von der Konsole zu verwenden. Wie bereits erwähnt, gibt es mehrere Möglichkeiten, die Aufgabe zu erledigen, aber Scanner ist ursprünglich für die Ausführung der Aufgabe vorgesehen. Dave Cheney erklärt, warum Sie Scanner anstelle von bufio.Reader's ReadLine verwenden sollten.
https://twitter.com/davecheney/status/604837853344989184?lang=de
Hier ist die Code-Snippet-Antwort für Ihre Frage
Wenn Sie die Eingaben nicht programmgesteuert erfassen möchten, fügen Sie einfach diese Zeilen hinzu
Die Ausgabe des obigen Programms lautet:
Das obige Programm sammelt die Benutzereingaben und speichert sie in einem Array. Wir können diesen Fluss auch mit einem besonderen Charakter unterbrechen. Der Scanner bietet eine API für die erweiterte Verwendung wie das Aufteilen mithilfe einer benutzerdefinierten Funktion usw., das Scannen verschiedener Arten von E / A-Streams (Stdin, String) usw.
quelle
Eine andere Möglichkeit, mehrere Eingaben innerhalb einer Schleife zu lesen, die eine Eingabe mit Leerzeichen verarbeiten kann:
Ausgabe:
quelle
Ich bin zu spät zur Party. Aber wie wäre es mit einem Liner:
und drücken Sie Strg + d (EOT), sobald die Eingabe in die Befehlszeile eingegeben wurde.
quelle
os.Stdin
es nicht "endet", ist es unmöglich, alles zu lesen. Sie könnten eine Weile warten ...mail
.Versuchen Sie diesen Code: -
quelle
Scanf()
keine Leerzeichen in der Zeichenfolge akzeptierenKann auch so gemacht werden: -
quelle
Lesen Sie einige angeforderte Werte sauber ein:
Hier ist ein Lauf:
quelle
Sie müssen einen Zeiger auf die Variable bereitstellen, die Sie scannen möchten, wie folgt:
quelle
In meinem Fall wartete das Programm nicht, da ich den
watcher
Befehl zum automatischen Ausführen des Programms verwendete. Das manuelle Ausführen des Programmsgo run main.go
führte zu "Text eingeben" und schließlich zum Drucken auf der Konsole.quelle
Scan*
Familie besteht darin, dass sie bis zu einem Leerzeichen (z. B. Leerzeichen) lesen.