Verifier si une valeur est un nombre. c++

Résolu/Fermé
dorian100 Messages postés 161 Date d'inscription dimanche 6 janvier 2008 Statut Membre Dernière intervention 6 août 2010 - 17 juil. 2009 à 14:23
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 16 sept. 2015 à 14:08
Bonjour,

question de routine pour les habitués de la programmation, comment vérifier si une variable int est bien un nombre pour ne pas faire planter mon programme ?

merci.

8 réponses

mamiemando : Sans déconner je trouve cette réponse vraiment nulle (avec celle d'avant ca fait 2) je répond jamais sur les forum mais la ca m'énerve un peu de voir ca.
Le mec demande une info et tout ce que tu trouve a dire c'est tourner autour du pot.
Personnellement, je peut t'assurer que y'a des gens assez simplet pour mettre une lettre au lieu d'un chiffre et autre chose importante que tu ne doit pas savoir si l'utilisateur rentre une lettre ca fait planter le programme et notre ami dorian100 voulais juste faire cette vérification. Dans le genre de réponse "je vois pas ce que tu veut dire mais j'essaye de répondre un truc a coté de la plaque" ....

pour dorian100 et les prochains qui vont chercher une réponse a cette question:

personnellement je pencherai pour enregistrer l'entrée de l'utilisateur dans un std::string et ensuite tester si la transformation du string est possible avec la référence sstream.

exemple de code :

#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main (void)
{
string s;
cout << "Tapez une chaine : "; getline (cin, s);
istringstream istr(s);
int i;

if (istr >> i) cout << "VOUS AVEZ TAPE L'ENTIER " << i << endl;
else cout << "VALEUR INCORRECTE" << endl;
return 0;
}

Cordialement,

PS : je sais que la date est ancienne mais c'est important (à mon sens) que des débutants qui cherchent des réponses ne soient pas dans une impasse comme ca et en plus, des personnes chercheront encore ces réponses et tomberont sur une solution plutot que sur la réponse de mamiemando.
51
mamiemando Messages postés 33325 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 octobre 2024 7 799
6 janv. 2012 à 01:12
Pour commencer : bonjour.

Je suis d'accord avec toi : mon 2e message était inapproprié car je n'avais toujours pas compris à ce moment là qu'il voulait contrôler une saisie clavier.

Je suis également d'accord sur le fait que déterrer un sujet de 2009 c'est pas top, surtout si c'est pour donner une solution qui globalement est moins bonne que celle déjà donnée (cf celle de fiddy).

De plus la réponse que je donnais à l'époque n'était pas pour tourner autour du pot, à l'époque je ne pensais pas qu'on pouvait contrôler la saisie avec la valeur de retour de <<. Car si tu tapes n'importe quoi tu récupères 0 dans ton entier et du coup tu ne peux rien tester. Bref, ce n'était pas pour le faire tourner en bourrique. Mais bon je te remercie pour ces remarques très sympathiques, ça fait toujours plaisir.

J'en profite pour te rappeler que le système de "vote" sur les réponses permet justement d'avoir les réponses de jugée de "bonne qualité" en haut du fil de discussion et ainsi permettre au débutant comme tu dis de tomber directement sur la réponse. Donc l'écueil auquel tu fais référence... n'est pas très significatif.

Maintenant si tu veux continuer cette discussion des plus captivantes, ça ne me pose pas de problème, mais plutôt par messages privés pour ne pas polluer davantage ce fil de discussion.

Merci pour ta contribution toutefois,
Cordialement.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
17 juil. 2009 à 23:18
Salut,
Par contre, ce que tu peux faire, c'est tester la valeur retourner par cin.
Par exemple :

int nbJoueur=0;
cout << "nombre:";
while( !(cin >> nbJoueur) ) {
    string tmp;
    cin.clear();
    cin >> tmp;
    cout << "incorrect" << endl;
}

Cdlt
7
Bonsoir,

essaye ça:

int demandeNr(string info)
{
int demandeNr(0);
do
{
cout <<endl <<info;
cin >>demandeNr;
cin.clear();
cin.ignore(100, '\n');

} while (!int(demandeNr));
return demandeNr;

il sort du boucle uniquement si vous avez entrée un numéro.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
16 sept. 2015 à 14:08
Ca ne répond pas à la question. Sinon merci de regarder la date des posts avant de répondre...
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
17 juil. 2009 à 17:10
Bonjour,

De manière générale c'est au moment de la collecte des données (de la donnée) que les contrôles (de numéricité, en l'occurrence) peuvent et doivent être effectués ( les programmes de collecte et de contrôle des données d'une application). Après il est bien tard, sinon trop tard, pour faire quelque chose, le traitement sera nécessairement erroné par carence (impossibilité de recréer la valeur erronée) ou plantage du programme.
-1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33325 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 octobre 2024 7 799
17 juil. 2009 à 17:26
Une variable int est toujours un entier, la question n'a pas de sens. Si tu n'initialises pas ton int, il contient une valeur arbitraire.

La question aurait un sens si tu te demandais si une chaîne de caractère correspond à un entier, mais ce n'est apparemment pas ton cas.

Bonne chance
-1
dorian100 Messages postés 161 Date d'inscription dimanche 6 janvier 2008 Statut Membre Dernière intervention 6 août 2010 3
17 juil. 2009 à 20:29
je pense que j'ai pas été assez précis, en fait je veux éviter un plantage de mon programme au cas ou l'utilisateur viendrait à taper des lettres à la place d'un chiffre entier.

j'avais pensé à un truc du genre mais je ne peux pas dire : nbjoueur != int ( c'est juste là que je coince).


while (nbjoueur != int)
{ cout << "Erreur. Veuillez entrer un nombre:" << endl; // vérification nbre nbjoueur =V int
cin >> nbjoueur;
}

en fait je débute en c++, excusez mon ignorance...


merci d'avance.
-1
mamiemando Messages postés 33325 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 octobre 2024 7 799
17 juil. 2009 à 22:34
Non mais c'est ce que je te dis, ça n'a pas de sens. Ta variable nbjoueur est toujours une valeur numérique. De plus un type ne peut pas intervenir dans une comparaison en C++.

La seule chose à éventuellement contrôler, c'est que cette variable est positive (chose que tu peux sous entendre si c'est une variable unsigned int) et pas trop grande. La lecture sur std::cin d'un entier ne permet pas à l'utilisateur de saisir une chaîne tu n'as donc rien à faire.

Bonne chance
-1
dorian100 Messages postés 161 Date d'inscription dimanche 6 janvier 2008 Statut Membre Dernière intervention 6 août 2010 3
18 juil. 2009 à 10:12
ok, sa va

Merci à tous et une bonne journée
-1