web-dev-qa-db-fra.com

C ++: comment vérifier si le tampon cin est vide?

Comment vérifiez-vous si l'utilisateur n'a rien saisi lors d'une commande cin et a simplement appuyé sur Entrée?

30
Matt Shindala

Lors de la lecture de std :: cin , il est préférable de ne pas utiliser opérateur d'extraction de flux>> car cela peut avoir toutes sortes d'effets secondaires désagréables. Par exemple, si vous avez ce code:

std::string name;
std::cin >> name;

Et j'entre John Doe, la ligne à lire depuis cin contiendra simplement la valeur John, laissant Doe derrière pour être lue par une future opération de lecture. De même, si je devais écrire:

int myInteger;
std::cin >> myInteger;

Et je tape ensuite John Doe, puis cin entrera dans un état d'erreur et refusera d'effectuer de futures opérations de lecture jusqu'à ce que vous effaciez explicitement son état d'erreur et vidiez les caractères qui ont causé l'erreur.

Une meilleure façon de faire une entrée utilisateur est d'utiliser std :: getline pour lire les caractères du clavier jusqu'à ce que l'utilisateur appuie sur Entrée. Par exemple:

std::string name;
getline(std::cin, name); // getline doesn't need the std:: prefix here because C++ has ADL.

ADL signifie recherche dépendante de l'argument. Maintenant, si j'entre John Doe, la valeur de name sera John Doe et il ne restera aucune donnée dans cin. De plus, cela vous permet également de tester si l'utilisateur vient d'appuyer sur Entrée:

std::string name;
getline(std::cin, name);

if (name.empty()) {
    /* ... nothing entered ... */
}

L'inconvénient de cette approche est que si vous souhaitez lire dans une ligne de données formatée, un int ou un double vous devrez analyser la représentation de la chaîne. Personnellement, je pense que cela en vaut la peine car cela vous donne un contrôle plus précis de ce qu'il faut faire si l'utilisateur entre quelque chose de non valide et "garde" cin de ne jamais entrer dans un état d'échec.

J'enseigne un cours de programmation C++, et j'ai quelques notes de cours sur la bibliothèque de flux qui va dans une bonne quantité de détails sur la façon de lire les données formatées de cin de manière sûre (principalement à la fin du chapitre). Je ne sais pas dans quelle mesure vous trouverez cela utile, mais au cas où cela serait utile, je pensais publier le lien.

J'espère que cela t'aides!

43
templatetypedef

cin ne poursuivra pas le programme sauf si l'utilisateur entre au moins 1 caractère (entrer ne compte pas). Si l'utilisateur ne donne AUCUNE entrée, cin attendra simplement que l'utilisateur donne une entrée, puis appuyez sur Entrée.

3
matzahboy