Comment verifier qu'on a bien un entier en entree? [Résolu]

Signaler
Messages postés
9
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
8 décembre 2006
-
Messages postés
9
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
8 décembre 2006
-
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

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
    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
Messages postés
9
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
8 décembre 2006

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...
Messages postés
9
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
8 décembre 2006

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...
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
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"
Messages postés
209
Date d'inscription
vendredi 11 avril 2003
Statut
Membre
Dernière intervention
14 août 2007

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.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Et surtout qu'apparemment il bosse en C++

ULARGE_INTEGERJokyQi=QI("Joky"
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Le mieux c'est GetWindowText()...

ciao...
BruNews, MVP VC++
Messages postés
9
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
8 décembre 2006

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....
Messages postés
9
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
8 décembre 2006

ehhh je precise que le prog est en ligne de commandes... ^^
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
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"
Messages postés
9
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
8 décembre 2006

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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
9
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
8 décembre 2006

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?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
T'as du te tromper quelque part, std est très bien reconnu par VC++ 2005

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
9
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
8 décembre 2006

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....