Maison  >  Article  >  développement back-end  >  Pourquoi fmt.Scanf() provoque-t-il une boucle infinie avec une entrée invalide dans Go ?

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

Patricia Arquette
Patricia Arquetteoriginal
2024-10-27 04:23:30356parcourir

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>

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!

Déclaration:
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