Invite en toute sécurité pour oui / non avec cin
Je suis dans une intro à la classe C++ et je me demandais à une meilleure méthode de vérifier si l'entrée était le type désiré.
Est-ce une bonne façon de le faire? Je viens de PHP/PERL fond qui me fait plutôt de l'appréhension de l'utilisation des boucles while.
char type;
while (true) {
cout << "Were you admitted? [y/n]" << endl;
cin >> type;
if ((type == 'y') || (type == 'n')) {
break;
}
}
Est-ce un sûr façon de faire cela ou suis-je à l'ouverture de moi-même jusqu'à un monde de souffrance, qui, je suppose? Ce serait une meilleure façon de faire en sorte que je obtenir de l'entrée, je veux avant de continuer?
source d'informationauteur Levi
Vous devez vous connecter pour publier un commentaire.
Personnellement, j'irais avec:
Personnellement, je ferais l'invite une fonction distincte, ceci permet de mettre l'invite de commandes de sortie et la lecture d'une réponse à une expression logique de le mettre dans une boucle while.
De tester si la lecture a été un succès est essentiel pour le bon fonctionnement du code.
Je voudrais aussi préfèrent utiliser
std::getline
pour obtenir une ligne à la fois car il contribue à réduire les erreurs causées par la lecture du reste de la moitié d'une ligne de lecture qui en a été le résultat d'une lecture partielle à plus tôt la réponse de l'utilisateur.Utiliser pouvez utiliser
si l'algorithme est similaire à votre exemple. Sinon, l'exemple est "safe", mais je ne suis pas sûr de la readablity.
Pourquoi ne pas le faire de cette façon?
C'est très bien. Si vous le souhaitez, le temps après un certain nombre d'échecs, vous pouvez utiliser le
i<10
mais sa ne vaut pas la peine.Et n'oubliez pas de faire votre potentiel de vie de l'usager est plus facile d'expliquer chaque étape et même de fournir à la casse d'entrée.
Basé sur la ligne d'entrée n'a pas à être commentée, vous pouvez le faire succincteavec une seule fonction de vous écrire une fois, encore des poignées d'angle cas:
Ici est un plus court chemin
Je n'ai jamais codé en PERL/PHP avant, mais en fonction de votre question et de l'exemple, voici une solution simple.
Vous serez invité jusqu'à ce que vous entrez dans un " y "après la saisie d'un" y " ce programme simple sera de sortie.
Le do...while construire est un peu fait pour cela, mais vous pouvez aussi faire tout le travail dans la condition de la boucle:
🙂
Et si vous ne voulez pas tester le succès de
std::cin >> answer
(e.g souhaitez faire une boucle à l'infini avec Ctrl+Z), vous pouvez remplacer&&
pour virgule 🙂Pas tout à fait sérieux, même si il me semble mettant l'invite dans la condition peut parfois améliorer la logique de ces boucles (éviter pause).
Je vois deux "problèmes" ici. La première est l'utilisation de while( true ). Je ne pense pas que c'est une bonne pratique (même si c'est probablement une question de goût, pour beaucoup de gens). La rupture à l'intérieur d'une boucle est toutefois intéressant pour la recherche:
C'est auto-explicatif: vous courez jusqu'à la fin du vecteur, mais si l'élément est trouvé, vous pause avant de l'atteindre. Il est justifiable.
Sur l'obtention d'informations à partir de la console, vous pouvez exécuter dans un grand nombre de problèmes de lecture directement à partir de cin, par exemple, être retourné le contenu que jusqu'à la première de l'espace si l'entrée a une. getline() est une fonction d'utilité qui lit une chaîne de caractères, qui est (presque) toujours sans danger. getline() est défini dans l'utilitaire d'en-tête. Vous n'avez également besoin de la chaîne d'en-tête. Et cstdio si vous souhaitez utiliser des expressions du FOLKLORE.
Modifier quoi que ce @McAden dit, essayez cette correction du bug où si vous entrez plusieurs personnages, le test vérifie uniquement la première lettre.
Un autre moyen d'inciter les pour o/n . "Le faire" ce "tout", vous n'obtenez pas ce que vous voulez. Faites ce que vous voulez avec elle; il fonctionne, tout simplement.
Cela vient aussi sans effets after effects!
Voici un autre moyen d'inciter les pour o/n. "Alors que" vous n'obtenez pas ce que vous voulez, "switch" sur votre entrée. Faites ce que vous voulez avec elle; il fonctionne, tout simplement.
Cela vient sans effets after effects!