2010-09-29 7 views
0

Comment faire en sorte que l'instruction cin accepte uniquement les entiers?Gestion des erreurs en C++

+1

Que voulez-vous dire par "accepte que les entiers"? Plus précisément, que voulez-vous faire lorsque/si l'utilisateur entre quelque chose d'autre (par exemple, une lettre ou une ponctuation)? –

+0

http://stackoverflow.com/questions/2292202/while-loop-with-try-catch-fails-at-bad-cin-input – karlphillip

+0

Le 'cin' est un objet générique, vous ne pouvez pas le modifier uniquement fournir des entiers. Vous pouvez modifier votre programme pour n'accepter que des entiers. Écrivez votre propre version filtrée de 'cin' ou écrivez quelque chose qui ne prend que des entiers d'un fichier et passez un fichier à votre programme. –

Répondre

5

Je ne pense pas que vous pouvez forcer std::cin à refuser d'accepter l'entrée non-intégrale dans tous les cas . Vous pouvez toujours écrire:

std::string s; 
std::cin >> s; 

car la chaîne ne se soucie pas du format de l'entrée. Cependant, si vous voulez tester si la lecture d'un nombre entier, vous pouvez réussi utiliser la méthode fail():

int i; 
std::cin >> i; 
if (std::cin.fail()) 
{ 
    std::cerr << "Input was not an integer!\n"; 
} 

Alternativement, vous pouvez tester l'objet cin lui-même, ce qui est équivalent.

int i; 
if (std::cin >> i) 
{ 
    // Use the input 
} 
else 
{ 
    std::cerr << "Input was not an integer!\n"; 
} 
+1

"Je ne pense pas que vous puissiez faire une telle chose globalement", vous pouvez définir 'cin.exception (ios :: failbit)' pour l'appliquer globalement. – ybungalobill

+0

@ybungalobill Même avec le masque d'exception, vous pouvez lire les autres types avec succès ('std :: string s; std :: cin >> s;'). À ma connaissance, il n'y a aucun moyen de forcer 'operator >>' à * always * quand on essaie de lire un type non-integral (même si l'entrée est au format correct). –

+0

Ah, je vois comment le libellé était confus maintenant. Modification –

-1

Mettez le cin dans une boucle while, et testez.

cin.exceptions(ios::failbit | ios::badbit); 
int a; 
bool bGet = true; 
while(bGet) 
{ 
    try 
    { 
    cin >> a; 
    bGet = false; 
    } 
    catch 
    { ; } 
}  
+0

'operator >>' ne lance pas d'exception dans ce cas, sauf si vous définissez un drapeau avec ios :: exceptions –

+0

Comme l'édition ?? – Jess

4
#include <iostream> 
#include <limits> 
using namespace std; 

int main(){ 
    int temp; 
    cout << "Give value (integer): "; 
    while(! (cin >> temp)){ 
     cout << "That was not an integer...\nTry again: "; 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    } 
    cout << "Your integer is: " << temp; 
} 

trouvé cette source: http://www.dreamincode.net/forums/topic/53355-c-check-if-variable-is-integer/ que je devais faire ce juste hier :)

0

Une autre approche utilisant std :: cin.

#include <iostream> 
#include <limits> 

using namespace std; 

int main() 
{ 

    double input; 
    while (cin) 
    { 
     cout << "Type in some numbers and press ENTER when you are done:" << endl; 
     cin >> input; 
     if (cin) 
     { 
      cout << "* Bingo!\n" << endl; 
     } 
     else if (cin.fail() && !(cin.eof() || cin.bad())) 
     { 
      cout << "* Sorry, but that is not a number.\n" << endl; 
      cin.clear(); 
      cin.ignore(numeric_limits<std::streamsize>::max(),'\n'); 
     } 
    } 
} 

g ++ -o num num.cpp