Quelle est la meilleure façon de faire de la validation de l'entrée en C++ avec cin?

Mon frère a récemment commencé à apprendre le C++. Il m'a un problème qu'il a rencontré en essayant de valider l'entrée dans un programme simple. Il avait un menu texte où l'utilisateur a entré un nombre entier choice, si ils sont entrés dans une défaillance de choix, ils seraient invités à les entrer de nouveau (boucle do while). Toutefois, si l'utilisateur a entré une chaîne au lieu d'un int, le code se briser.
J'ai lu plusieurs questions sur stackoverflow et lui dit de le réécrire son code le long des lignes de:

#include<iostream>
using namespace std;

int main()
{
    int a;
    do
    {
    cout<<"\nEnter a number:"
    cin>>a;
        if(cin.fail())
        {
            //Clear the fail state.
            cin.clear();
            //Ignore the rest of the wrong user input, till the end of the line.
            cin.ignore(std::numeric_limits<std::streamsize>::max(),\
                                                    '\n');
        }
    }while(true);
    return 0;
}

Bien que cela a fonctionné ok, j'ai aussi essayé quelques autres idées:
1. À l'aide d'un bloc try catch. Il n'a pas de travail. Je pense que c'est parce qu'une exception n'est pas soulevée en raison de la mauvaise entrée.
2. J'ai essayé if(! cin){//Do Something} qui ne fonctionne pas non plus. Je n'ai pas encore compris ça.
3. Troisièmement, j'ai essayé de la saisie d'une chaîne de longueur fixe et ensuite l'analyser. Je voudrais utiliser atoi(). Est-ce conforme aux normes et portable? Dois-je écrire ma propre fonction d'analyse syntaxique?
4. Si écrire une classe qui utilise cin, mais de façon dynamique ce type de détection d'erreur, peut-être par déterminer le type de la variable d'entrée au moment de l'exécution, aurait-il trop de frais généraux? Est-il même possible?

Je voudrais savoir quelle est la meilleure façon de faire ce genre de vérification, quelles sont les meilleures pratiques?

Je tiens à ajouter que, si je ne suis pas nouvelle à l'écriture de code C++, je suis nouveau à la rédaction d'un bon code conforme aux standards. Je suis en train de désapprendre les mauvaises pratiques et d'apprendre le droit. Je serais très reconnaissant si answerers donner une explication détaillée.

MODIFIER: je vois que litb a répondu à une de mes précédentes éditions. Je vais poster le code ici pour référence.

#include<iostream>
using namespace std;

int main()
{
    int a;
    bool inputCompletionFlag = true;
    do
    {
    cout<<"\nEnter a number:"
    cin>>a;
        if(cin.fail())
        {
            //Clear the fail state.
            cin.clear();
            //Ignore the rest of the wrong user input, till the end of the line.
            cin.ignore(std::numeric_limits<std::streamsize>::max(),\
                                                    '\n');
        }
        else
        {
            inputCompletionFlag = false;
        }
    }while(!inputCompletionFlag);
    return 0;
}

Ce code ne fonctionne pas sur une entrée comme "1asdsdf". Je ne savais pas comment le réparer, mais litb a affiché une grande réponse. 🙂

OriginalL'auteur |