Maison > développement back-end > Golang > le corps du texte

Pourquoi fmt.Scanf() provoque-t-il une boucle infinie avec une entrée invalide dans Go ?

Patricia Arquette
Libérer: 2024-10-27 04:23:30
original
365 Les gens l'ont consulté

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

Comment gérer les entrées invalides dans fmt.Scanf de Go

Pour ceux qui rencontrent des problèmes avec des entrées invalides lors de l'utilisation de fmt.Scanf(), c'est essentiel pour comprendre pourquoi le programme entre dans une boucle infinie lorsqu'une chaîne est saisie au lieu d'un entier.

Dans Go, fmt.Scanf() analyse le flux d'entrée pour un spécificateur de format spécifique (par exemple, "%d " pour un entier décimal). Une entrée non valide, telle qu'une chaîne, provoque une erreur, mais l'entrée reste dans le tampon Stdin. Par conséquent, les appels ultérieurs à fmt.Scanf() continuent de traiter la même entrée invalide, ce qui entraîne une boucle infinie.

Solution utilisant fmt.Scanln

Une approche alternative consiste à utiliser fmt.Scanln(), qui se comporte différemment. Il lit et consomme toute la ligne d'entrée, y compris les caractères non valides. Cela peut être mis en œuvre comme suit :

<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>
Copier après la connexion

Options supplémentaires

Si fmt.Scanln() n'est pas optimal, d'autres options incluent :

  • Réinitialisation du tampon Stdin : Utilisez bufio.Reader.Reset() ou bufio.NewReader() pour effacer le tampon.
  • Validation des entrées personnalisées : Créer une boucle qui lit et valide les entrées à plusieurs reprises jusqu'à ce qu'une entrée valide soit reçue.
  • Utilisez une bibliothèque d'entrée dédiée : Pensez à utiliser une bibliothèque telle que bufio.Reader, qui offre plus de contrôle sur la gestion des entrées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!