Heim  >  Artikel  >  Backend-Entwicklung  >  Warum verursacht fmt.Scanf() eine Endlosschleife mit ungültiger Eingabe in Go?

Warum verursacht fmt.Scanf() eine Endlosschleife mit ungültiger Eingabe in Go?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-27 04:23:30356Durchsuche

Why Does fmt.Scanf() Cause an Infinite Loop with Invalid Input in Go?

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:

  • Zurücksetzen des Stdin-Puffers:Verwenden Sie bufio.Reader.Reset() oder bufio.NewReader(), um den Puffer zu löschen.
  • Benutzerdefinierte Eingabevalidierung: Erstellen eine Schleife, die Eingaben wiederholt liest und validiert, bis eine gültige Eingabe empfangen wird.
  • Verwenden Sie eine dedizierte Eingabebibliothek: Erwägen Sie die Verwendung einer Bibliothek wie bufio.Reader, die mehr Kontrolle über die Eingabeverarbeitung bietet.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn