Comment verifier qu'on a bien un entier en entree?

Résolu
cs_filsdugrand Messages postés 9 Date d'inscription mardi 13 décembre 2005 Statut Membre Dernière intervention 8 décembre 2006 - 8 déc. 2006 à 15:06
cs_filsdugrand Messages postés 9 Date d'inscription mardi 13 décembre 2005 Statut Membre Dernière intervention 8 décembre 2006 - 8 déc. 2006 à 20:42
bojours,
voila je programme une petite calculette en ce moment pour mes etudes et je coince sur un petit probleme: comment verifier que ce qui a ete donné en entrée c'est bien des entiers????
exemple:

int a;
cout << "veillez entrer un ENTIER svp (priere de ne pas entrer de cochoneries a la place pasque ca va bugger, je vous previns je n'ai pas gerer ce type de problemes!!!!!!!!)"
cin >> a;


comment faire en sorte de (au moins) quitter le programme proprement si qqun (le prof...^^) s'ammuse a rentrer "blabla" a la place d'un entier???
le programme quitte avant que je puisse verifier ce qui a ete entré comme valeur.
j'imagine que ca doit se gerer par des exception deja definie dans windows (je sais definir mes propres exception mais la je ne vois pas trop) a savoir que j'ai deja une classe erreur ou plusieurs exceptions sont deja definie, si je pouvais juste en rajouter une...

merci d'avance pour votre aide

16 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 déc. 2006 à 16:41
    char *input; //j'aurai preferer travailler avec des strig mais bon
    cin >> input; // je sais meme pas si ca marche

Bravo, pointeur non initialisé

Voila ce que je propose sinon:

  int n;
  if(cin >> n) cout << "C'est un entier: " << n << endl;
  else cout << "Ce n'est pas un entier" << endl;

_____________________________________
Un éditeur de ressources gratuit pour Windows
3
cs_filsdugrand Messages postés 9 Date d'inscription mardi 13 décembre 2005 Statut Membre Dernière intervention 8 décembre 2006
8 déc. 2006 à 17:46
vecchio56 tu es mon heros xD
ca marxhe nikel crome ton truc voila ce que ca donne pour ma classe complexe par exemple:

istream &
operator>>(istream &os, Complexe &com)
{
cout << "entrez la partie reele:" << endl;
if(!(cin >> com.m_Reel))
{
 Erreur a(Erreur::winput);
 throw(a);
 }
cout << endl;
cout << "entrez la partie imaginaire:" << endl;
if(!(cin >> com.m_Imaginaire))
{
 Erreur a(Erreur::winput);
 throw(a);
}
}

j'ai bien entandu cree une classe erreur pour les exeption ect...
3
cs_filsdugrand Messages postés 9 Date d'inscription mardi 13 décembre 2005 Statut Membre Dernière intervention 8 décembre 2006
8 déc. 2006 à 20:42
pour le probleme de namespace je met la solution malgré tout si ca peut aider qqun: contrairement a dev c++ VS a besoin qu'on declare le using apres les Includes...
3
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
8 déc. 2006 à 15:42
C'est évident que c'est à toi de gérer et pas à l'utilisateur

char c[255];
cout << "Entrer un entier : ";
cin >> c;

char *d = c;
while (*d)
{
    if ((*d < '0') ||  (*d > '9'))
       return;      //ce n'est pas un entier
    d++;
}

ULARGE_INTEGERJokyQi=QI("Joky"
0

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

Posez votre question
meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
8 déc. 2006 à 16:05
Salut,

Voici un exemple simple :





#include <stdio.h>
#include <string.h>

int isinteger(char *n)
{
        int i=0;
        int a=0;

        for(i = 0; n[i] != 0; i++)
        {
                if(isdigit(n[i]))
                {
                        a += 1;
                }
        }
         return a / strlen(n);
}

int main(int argc, char** argv)
{
  char* n;
  fflush(stdin);
  printf("saisir un entier : ");
  scanf("%s",&n);
  while (!isinteger(&n)) {
    fprintf(stderr, "ceci n'est pas un entier\n");
    printf("saisir un entier : ");
    scanf("%s",&n);
  }
  return(0);
}





En espérant t'avoir aidé,
Ciao.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 déc. 2006 à 16:08
le mieux est d'utiliser fgets, ou cin.getline (mais surtout pas scanf qui ne permet pas de spécifier la taille du tampon)

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
8 déc. 2006 à 16:11
Et surtout qu'apparemment il bosse en C++

ULARGE_INTEGERJokyQi=QI("Joky"
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 déc. 2006 à 16:23
Le mieux c'est GetWindowText()...

ciao...
BruNews, MVP VC++
0
cs_filsdugrand Messages postés 9 Date d'inscription mardi 13 décembre 2005 Statut Membre Dernière intervention 8 décembre 2006
8 déc. 2006 à 16:34
bonjours et merci pour vos reponses,
maisj'ai du mal m'exprimer ce n'est pas les entiers mon principal soucis (meme pas du tour car dans l'absolu je veut des float c'etais juste pour simplifier la question mais bon tout le monde c'est concentré dessu^^) non mon soucis c'est lkes chaine de caractere type: "je rebtre une phrase a la place d'un numero rien que pour te faire chier" c'est ca mon probleme

donc si pour le moment je fait juste

float monNombre;
cin >> monNombre;

et il faudrai le remplacer par:
float monNombre = VerifierLeNombreEnEntreeEtLeRenvoyer();

float
VerifierLeNombreEnEntreeEtLeRenvoyer()
{
    char *input; //j'aurai preferer travailler avec des strig mais bon
    cin >> input; // je sais meme pas si ca marche
    if(input.VerifierQuIlNyAPasDeConneries())//cette fonction verifie qu'il n'y a pas de conneries en entree
    {
        return atof(& input);
    }
    else{
        lever une exception qui va envoyer balader l'utilasateur farceur();
        //ca c bon je sais faire^^
    }
}

donc le pb c'est surtout cette fonction dans l'absolue j'ai trouvé
strtod() une fonction qui ressemble a atof() mais qui en plus verifie que c'est bien un nombre qui a ete entrée mais en cas d'erreur elle revoi 0 donc les 0 sons considerée comme des erreur et ca pose probleme ca....
0
cs_filsdugrand Messages postés 9 Date d'inscription mardi 13 décembre 2005 Statut Membre Dernière intervention 8 décembre 2006
8 déc. 2006 à 16:36
ehhh je precise que le prog est en ligne de commandes... ^^
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
8 déc. 2006 à 16:41
Oui recommence tout à 0
Si tu nous dit entier, c'est normal qu'on fait pour des entiers...
Regarde ma solution elle est très bien pour ce que tu veux, vaut juste dire qu'il oublier les virgules ou les points

Enfin bref,  et en effet

char *input; //j'aurai preferer travailler avec des strig mais bon
    cin >> input; // je sais meme pas si ca marche

ça ne marche pas
On n'écrit pas n'importe où...

ULARGE_INTEGERJokyQi=QI("Joky"
0
cs_filsdugrand Messages postés 9 Date d'inscription mardi 13 décembre 2005 Statut Membre Dernière intervention 8 décembre 2006
8 déc. 2006 à 17:03
desolé je suis un peut rouiller en C++ je savais bien que ca ne marcherai pas trop c'etais juste pour donner une idee de ce que je voulais faire mais pour en revenir a ce qu'a dit vecchio56 (if(cin >> n)) l'operator >> renvoi 0 en cas d'echec de l'operation d'affectation...?? je n'arrive pas a trouver ca sur le man, mais si qqun a des infos ca serai avec plaisir
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 déc. 2006 à 17:07
Ca marche je peux te l'assurer

En fait, ca revient à écrire cela:
  int n;
  cin >> n;
  if(!cin.fail()) cout << "C'est un entier: " << n << endl;
  else cout << "Ce n'est pas un entier" << endl;

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
cs_filsdugrand Messages postés 9 Date d'inscription mardi 13 décembre 2005 Statut Membre Dernière intervention 8 décembre 2006
8 déc. 2006 à 18:21
ehh petite question qui n'a rien a voir avec le reste: je travaillais sur dev c++ mais mon prog doit pouvoir compiler sous VS2005 le probleme c'est que cette µ$%§¤ n'a pas l'aire de reconnaitre les using name space std;!!!!!! et ca me sort une erreure
error C2871: 'std' : a namespace with this name does not exist
Oo qqun a une idée?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 déc. 2006 à 18:23
T'as du te tromper quelque part, std est très bien reconnu par VC++ 2005

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
cs_filsdugrand Messages postés 9 Date d'inscription mardi 13 décembre 2005 Statut Membre Dernière intervention 8 décembre 2006
8 déc. 2006 à 20:40
rahhhh!! j'en peut plus bah finalement ca marche pas tout a fait.des fois ca me fait une erreure de segmentation pour je ne sais quel raison au niveau de:
if(!(cin >> com.m_Reel))
vecchio56 si tu pouvais regarder dans le programme que je t'ai envoyer ca marche parfaitement pour des matrices de taille inferieur a 2*2 mais des qu'on passe aux matrice 3*3 et qu'on rentre une phrase au premier element ca fait une seg fault....
0
Rejoignez-nous