Wie man mit ungültigen Eingaben in Gos fmt.Scanf umgeht
Für diejenigen, die bei der Verwendung von fmt.Scanf() auf Probleme mit ungültigen Eingaben stoßen, ist dies der Fall Es ist wichtig zu verstehen, warum das Programm in eine Endlosschleife geht, wenn eine Zeichenfolge anstelle einer Ganzzahl eingegeben wird.
In Go analysiert fmt.Scanf() den Eingabestream nach einem bestimmten Formatbezeichner (z. B. „%d " für eine dezimale Ganzzahl). Eine ungültige Eingabe, beispielsweise eine Zeichenfolge, verursacht einen Fehler, die Eingabe verbleibt jedoch im Stdin-Puffer. Folglich verarbeiten nachfolgende Aufrufe von fmt.Scanf() weiterhin dieselbe ungültige Eingabe, was zu einer Endlosschleife führt.
Lösung mit fmt.Scanln
Ein alternativer Ansatz ist die Verwendung von fmt.Scanln(), das sich anders verhält. Es liest und verarbeitet die gesamte Eingabezeile, einschließlich aller ungültigen Zeichen. Dies kann wie folgt implementiert werden:
<code class="go">fmt.Printf("Please enter an integer: ") // Read in an integer var i int _, err := fmt.Scanln(&i) if err != nil { fmt.Printf("Error: %s", err.Error()) // If int read fails, read as string and forget var discard string fmt.Scanln(&discard) return } fmt.Printf("Input contained %d", i)</code>
Zusätzliche Optionen
Wenn fmt.Scanln() nicht optimal ist, sind weitere Optionen:
Das obige ist der detaillierte Inhalt vonWarum verursacht fmt.Scanf() eine Endlosschleife mit ungültiger Eingabe in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!