13 votes

c++, comment vérifier que les données entrées sont du bon type de données ?

Duplicata possible :
comment valider l'entrée de l'utilisateur comme un double en C++ ?

Je suis novice en C++, et j'ai une fonction dans laquelle je veux que l'utilisateur saisisse une valeur de double valeur. Comment puis-je m'assurer que la valeur saisie est du bon type de données ? De même, comment gérer une erreur ? Pour l'instant, c'est tout ce que j'ai :

if(cin >> radius){}else{}

J'utilise `try{}catch(){}, mais je ne pense pas que ce soit la bonne solution pour ce problème. Toute aide serait appréciée.

22voto

Zeta Points 34033

Si ostream& operator>>(ostream& , T&) échoue dans l'extraction de données formatées (telles que les entiers, les doubles, les flottants, ...), stream.fail() sera vrai et donc !stream sera également évalué comme vrai.

Vous pouvez donc utiliser

cin >> radius;
if(!cin){
    cout << "Bad value!";
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cin >> radius;
}

ou simplement

while(!(cin >> radius)){
    cout << "Bad value!";
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

Il est important de ignore le reste de la ligne, puisque operator>> n'extraira plus aucune donnée du flux car elle est dans un mauvais format. Ainsi, si vous supprimez

cin.ignore(numeric_limits<streamsize>::max(), '\n');

votre boucle ne se terminera jamais, car l'entrée n'est pas effacée de l'entrée standard.

Voir aussi :

3voto

Jesse Good Points 22971

Vous devez lire la ligne entière en utilisant std::getline y std::string . C'est la façon de vérifier pleinement que la ligne entière est du type de données correct :

std::string line;
while(std::getline(std::cin, line))
{
    std::stringstream ss(line);
    if ((ss >> radius) && ss.eof())
    {
       // Okay break out of loop
       break;
    }
    else
    {
       // Error!
       std::cout << "Invalid input" << std::endl;
    }
}

1voto

Vikas Points 66

Cet exemple est explicite, mais avec cette approche vous ne pouvez pas faire la distinction entre int y double les types de données.

int main()
{
  double number = 0;

  if (!(std::cin >> number))
  {
    std::cout << "That's not a number; ";
  }
  else
  {
    std::cout << "That's  a number; ";
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X