382 Stimmen

Wie kann ich von der Standardeingabe in der Konsole lesen?

Ich möchte Eingaben aus der Befehlszeile lesen, aber meine Versuche endeten damit, dass das Programm beendet wird, bevor ich zur Eingabe aufgefordert werde. Ich bin auf der Suche nach dem Äquivalent von Console.ReadLine() in C#.

Das ist mein aktueller Code:

package main

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

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Text eingeben: ")
    text, _ := reader.ReadString('\n')
    fmt.Println(text)

    fmt.Println("Text eingeben: ")
    text2 := ""
    fmt.Scanln(text2)
    fmt.Println(text2)

    ln := ""
    fmt.Sscanln("%v", ln)
    fmt.Println(ln)
}

413voto

Linear Punkte 20141

Ich bin mir nicht sicher, was mit dem Block falsch ist

reader := bufio.NewReader(os.Stdin)
fmt.Print("Text eingeben: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)

Da es auf meinem Computer funktioniert. Allerdings benötigen Sie für den nächsten Block einen Zeiger auf die Variablen, denen Sie die Eingabe zuweisen. Versuchen Sie, fmt.Scanln(text2) durch fmt.Scanln(&text2) zu ersetzen. Verwenden Sie nicht Sscanln, da es eine Zeichenkette analysiert, die bereits im Speicher vorhanden ist, anstatt von der Standardeingabe zu lesen. Wenn Sie etwas Ähnliches wie das, was Sie versucht haben, tun möchten, ersetzen Sie es durch fmt.Scanf("%s", &ln)

Wenn das immer noch nicht funktioniert, könnte der Schuldige einige seltsame Systemeinstellungen oder eine fehlerhafte IDE sein.

168voto

Helin Wang Punkte 3730

Sie können es auch versuchen:

scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}

if scanner.Err() != nil {
    // Fehler behandeln.
}

130voto

Pith Punkte 3550

Ich denke, eine standardmäßigere Methode wäre:

package main

import "fmt"

func main() {
    fmt.Print("Text eingeben: ")
    var eingabe string
    fmt.Scanln(&eingabe)
    fmt.Print(eingabe)
}

Schau dir das scan godoc an: http://godoc.org/fmt#Scan

Scan scannt den Text, der von der Standardeingabe gelesen wird, und speichert aufeinander folgende durch Leerzeichen getrennte Werte in aufeinander folgende Argumente. Zeilenumbrüche zählen als Leerzeichen.

Scanln ist ähnlich wie Scan, stoppt jedoch das Scannen bei einem Zeilenumbruch und nach dem letzten Element muss ein Zeilenumbruch oder EOF stehen.

82voto

Naren Yellavula Punkte 6408

Versuchen Sie immer, bufio.NewScanner zum Sammeln von Eingaben aus der Konsole zu verwenden. Wie andere bereits erwähnt haben, gibt es mehrere Möglichkeiten, um den Job zu erledigen, aber Scanner ist ursprünglich dazu gedacht, den Job zu erledigen. Dave Cheney erklärt, warum Sie Scanner anstelle von bufio.Reader's ReadLine verwenden sollten.

https://web.archive.org/web/20190508023954/https://twitter.com/davecheney/status/604837853344989184

Hier ist die Code-Schnipsel-Antwort auf Ihre Frage

package main

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

/*
 Drei Möglichkeiten der Eingabe
   1. fmt.Scanln(&input)
   2. reader.ReadString()
   3. scanner.Scan()

   Hier empfehlen wir die Verwendung von bufio.NewScanner
*/

func main() {
    // Dynamisches Array erstellen
    arr := make([]string, 0)
    scanner := bufio.NewScanner(os.Stdin)
    for {
        fmt.Print("Text eingeben: ")
        // Liest eine Zeile von Stdin(Konsole) ein
        scanner.Scan()
        // Hält den eingescannten String
        text := scanner.Text()
        if len(text) != 0 {
            fmt.Println(text)
            arr = append(arr, text)
        } else {
            break
        }

    }
    // Verwendet die gesammelten Eingaben
    fmt.Println(arr)
}

Wenn Sie die Eingaben nicht programmgesteuert sammeln möchten, fügen Sie einfach diese Zeilen hinzu

   scanner := bufio.NewScanner(os.Stdin)
   scanner.Scan()
   text := scanner.Text()
   fmt.Println(text)

Die Ausgabe des obigen Programms wird sein:

Text eingeben: Bob
Bob
Text eingeben: Alice
Alice
Text eingeben:
[Bob Alice]

Das obige Programm sammelt die Benutzereingaben und speichert sie in einem Array. Wir können diesen Ablauf auch mit einem Sonderzeichen unterbrechen. Scanner bietet eine API für erweiterte Verwendung wie das Aufteilen mit einer benutzerdefinierten Funktion, das Scannen verschiedener Arten von I/O-Streams (Standard Stdin, String), etc.

Bearbeitung: Der Tweet, der im Originalbeitrag verlinkt ist, ist nicht zugänglich. Man kann aber eine offizielle Referenz zur Verwendung von Scanner aus dieser Standardbibliotheksdokumentation finden: https://pkg.go.dev/bufio@go1.17.6#example-Scanner-Lines

16voto

Chiheb Nexus Punkte 8594

Ein weiterer Weg, um mehrere Eingaben innerhalb einer Schleife zu lesen, die eine Eingabe mit Leerzeichen verarbeiten kann:

package main
import (
    "fmt"
    "bufio"
    "os"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    var text string
    for text != "q" {  // die Schleife unterbrechen, wenn text == "q"
        fmt.Print("Geben Sie Ihren Text ein: ")
        scanner.Scan()
        text = scanner.Text()
        if text != "q" {
            fmt.Println("Ihr Text war: ", text)
        }
    }
}

Ausgabe:

Geben Sie Ihren Text ein: Hallo Welt!
Ihr Text war:  Hallo Welt!
Geben Sie Ihren Text ein: Go ist großartig!
Ihr Text war:  Go ist großartig!
Geben Sie Ihren Text ein: q

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X