Gérer les erreurs de saisie

Ce petit tutoriel, sous forme de fonctions commentées, montre comment gérer des erreurs de saisie (en console par exemple).
Les 2 fonctions ci-dessous détaillent un des modes opératoires possibles.
Elles sont fonctionnelles, écrites sans l'utilisation d'espaces de noms et nécessitent l'include <sstream> pour que l'istringstream et l'ostringstream puissent fonctionner.

//--------------------------------------------------------------------------------------------

int entier() // demande d'un entier.

{

    std::string saisie;

    std::string verif;

    bool good = 1;

    bool trouble = 0;

    int num;

    do

    {

    if(good == 0){std::cout << "\n-> Saisie incorrecte, ressaisissez: ";}

    std::cin >> saisie;

    std::istringstream iss(saisie);

    iss >> num; // conversion du type string en type int.

    if(iss.fail()) // lorsqu'on insère uniquement des caractères lettre, le passage dans un type numérique ==> 0 , ce qui ne déclenche pas nécessairement d'anomalie lors de l'exécution (notamment lors de la saisie d'un seul caractère (lettre) ) alors même qu'il y a une erreur. D'où l'instauration du iss.fail(), permettant de s'abstenir de réaliser la procédure de vérification ci-dessous qui, à cause de cette conversion, ne verrait pas nécessairement une différence de taille entre le string saisie et le string verif.

    {

    good = 0;

    trouble = 1;

    }

    else // le cas où il n'y a pas que des caractères lettres, mais des caractères numériques suivit de lettres puis à nouveau de chiffres (ou pas).

    {

    std::ostringstream oss;

    oss << num; // conversion du type int en type string.

    verif = oss.str(); // retourne une copie de l'objet string équivalent à ce qui est dans le buffer (lorsqu'on entre par exemple 2e3, comme cela peut faire 2000, il n'y aura pas d'erreur à retourner).

    if(verif.size() < saisie.size()) // lors du passage dans la variable num, les caractères autres que numérique sont enlevés par stringstream, par conséquent, lorsqu'on met le contenu de num dans un autre string, la taille des 2 strings sera différente.

    {

    good = 0;

    trouble = 1;

    }

    else{good = 1;}

    }

    if(good == 1 && trouble == 1){std::cout << "-> OK!" << std::endl;}

    }while(good == 0);

    return num;

}

//------------------------------------------------------------------------------------------

double reel() // demande d'un réel

{

    std::string saisie;

    std::string verif;

    size_t found; // type de variable spécifiquement utilisé pour le traitement d'une chaine de caractères en fonction de sa taille.

    bool good=1;

    bool trouble=0;

    double num;

    do

    {

    if(good == 0){std::cout << "\n-> Saisie incorrecte, ressaisissez: ";}

    std::cin >> saisie;

    found = saisie.find_first_of(","); // on va chercher dans la chaine saisie si il y a une virgule française, si il n'y en a pas, nous seront à npos (fin de chaîne)

    while (found != std::string::npos) // mais si il y en a, tant que nous ne seront pas arrivés à la fin de la chaine...

    {

    saisie[found] = '.'; // ...la virgule française sera transformée en point...

    found = saisie.find_first_of("," , found+1); // ... tant qu'il y en aura, afin d'arriver à la fin de la chaîne. (bien que cela ne soit pas nécessairement utile en soi...)

    }

    // tout ce qu'il y a en dessous est identique à la fonction entier() mais pour les doubles.

    std::istringstream iss(saisie);

    iss >> num;

    if(iss.fail())

    {

    good = 0;

    trouble = 1;

    }

    else

    {

    std::ostringstream oss;

    oss << num;

    verif = oss.str();

    if(verif.size() < saisie.size())

    {

    good = 0;

    trouble = 1;

    }

    else{good = 1;}

    }

    if(good == 1 && trouble == 1){std::cout << "-> OK!" << std::endl;}

    }while(good == 0);

    return num;

}

//------------------------------------------------------------------------------------------------
Ce document intitulé « Gérer les erreurs de saisie » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous