OVH Cloud OVH Cloud

vérification "entier" bien entré

7 réponses
Avatar
Nicolas Aunai
salut,


j'ai un petit programme dans lequel on demande à l'utilisateur de taper
un entier, celui ci est capté par cin>>i; quel est le moyen de vérifier
que j'ai bien un entier, et que l'utilisateur n'a par exemple pas tapé
"toto"

je saurai le faire en C, mais là en c++ je coince

merci de l'aide

--
Nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@hotmail.com

7 réponses

Avatar
Fabien SK
Nicolas Aunai wrote:

j'ai un petit programme dans lequel on demande à l'utilisateur de taper
un entier, celui ci est capté par cin>>i; quel est le moyen de vérifier
que j'ai bien un entier, et que l'utilisateur n'a par exemple pas tapé
"toto"


int dummy;
std::cin >> dummy;
if (std::cin.fail()==true)
{
// erreur
}

Avatar
Sylvain Togni

int dummy;
std::cin >> dummy;
if (std::cin.fail()==true)
{
// erreur
}


Ou plus simplement :

int dummy;
if (std::cin >> dummy)
{
// ok
}

C'est moins explicite mais c'est la façon idomatique de faire.

--
Sylvain

Avatar
kanze
Fabien SK <fabsk+ wrote in message
news:<3f8bf97d$0$13275$...

Nicolas Aunai wrote:

j'ai un petit programme dans lequel on demande à l'utilisateur de
taper un entier, celui ci est capté par cin>>i; quel est le moyen de
vérifier que j'ai bien un entier, et que l'utilisateur n'a par
exemple pas tapé "toto"


int dummy;
std::cin >> dummy;
if (std::cin.fail()==true)


if ( std::cin.fail() ) ...

{
// erreur
}


Ce qui ne distingue pas entre la fin de fichier et une erreur.

La façon idiomatique de le faire, c'est :

int dummy ;
std::cin >> dummy ;
if ( ! cin ) {
if ( cin.eof() ) {
// fin de fichier...
} else {
// erreur de formattage...
}
}

Je ne dis pas que c'est bien ou élégant, mais c'est l'idiome, et ça
évite toutes les ambiguïtés en ce qui concerne la sémantique de good(),
bad() et fail().

Enfin, il faut peut-être aussi rappeler que les bits d'erreurs sont
persistants ; si après avoir détecter l'erreur, on veut continuer, il
faudrait quelque chose du genre :

std::cin.clear() ;
std::cin.ignore( INT_MAX, 'n' ) ;
std::cout << "Je n'ai rien compris, ressayer:" ;
// ...

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
Fabien LE LEZ
On 15 Oct 2003 01:15:27 -0700, wrote:

La façon idiomatique de le faire, c'est :

int dummy ;
std::cin >> dummy ;


J'aurais cru que la façon idiomatique de faire ça, c'était de lire une
ligne dans un std::string, puis de parser la chaîne, non ? ;-)

--
http://www.giromini.org/usenet-fr/repondre.html

Avatar
kanze
Fabien LE LEZ wrote in message
news:...
On 15 Oct 2003 01:15:27 -0700, wrote:

La façon idiomatique de le faire, c'est :

int dummy ;
std::cin >> dummy ;


J'aurais cru que la façon idiomatique de faire ça, c'était de lire une
ligne dans un std::string, puis de parser la chaîne, non ? ;-)


Ça dépend. En général, dans de réeles applications, oui. Parce qu'il
faut une gestion d'erreurs bien plus poussée. Mais ce n'est pas une
règle absolue, et dans des petits programmes d'exemple, ou des
utilitaires vite faits, on peut s'en passer.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
Benoit Rousseau
wrote:
Fabien LE LEZ wrote in message
news:...

On 15 Oct 2003 01:15:27 -0700, wrote:



La façon idiomatique de le faire, c'est :




int dummy ;
std::cin >> dummy ;




J'aurais cru que la façon idiomatique de faire ça, c'était de lire une
ligne dans un std::string, puis de parser la chaîne, non ? ;-)



Ça dépend. En général, dans de réeles applications, oui. Parce qu'il
faut une gestion d'erreurs bien plus poussée. Mais ce n'est pas une
règle absolue, et dans des petits programmes d'exemple, ou des
utilitaires vite faits, on peut s'en passer.



J'ai aussi le cas qui c'est présenté à moi et je n'arrivais plus à le
faire...
Je lisais d'un flux venant d'un fichier F. Je pouvais lire soit un
entier soit le caractère '*' qui signifié que je devais calculer
l'entier avec les données que j'avais déjà.

Je faisais donc :
F >> ws ;

if ( (c = F.fetch()) == '*' ) {
...; //calcul de la valeur
F.get();
} else if( isdigit( c ) )
F >> entier;


Le problème c'est que fetch ne marche pas :( comment faire ?

Note : Oui, je vais m'acheter un bouquin, je le promets !

--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/



Avatar
kanze
Benoit Rousseau wrote in message
news:<3f8faceb$0$9900$...
wrote:
Fabien LE LEZ wrote in message
news:...

On 15 Oct 2003 01:15:27 -0700, wrote:

La façon idiomatique de le faire, c'est :

int dummy ;
std::cin >> dummy ;


J'aurais cru que la façon idiomatique de faire ça, c'était de lire
une ligne dans un std::string, puis de parser la chaîne, non ? ;-)


Ça dépend. En général, dans de réeles applications, oui. Parce qu'il
faut une gestion d'erreurs bien plus poussée. Mais ce n'est pas une
règle absolue, et dans des petits programmes d'exemple, ou des
utilitaires vite faits, on peut s'en passer.


J'ai aussi le cas qui c'est présenté à moi et je n'arrivais plus à le
faire...
Je lisais d'un flux venant d'un fichier F. Je pouvais lire soit un
entier soit le caractère '*' qui signifié que je devais calculer
l'entier avec les données que j'avais déjà.

Je faisais donc :
F >> ws ;

if ( (c = F.fetch()) == '*' ) {
...; //calcul de la valeur
F.get();
} else if( isdigit( c ) )
F >> entier;

Le problème c'est que fetch ne marche pas :( comment faire ?


C'est peut-être qu'il n'y a pas de fonction fetch dans std::istream.
Est-ce que ce n'est pas plutôt peek que tu voulais ?

source >> ws ;
if ( source.peek() == '*' ) {
source.get() ;
...
} else {
source >> entier ;
if ( ! source ) ...
...
}

Mais déjà, quand on commence à avoir de telles complications, je préfère
de lire par lignes.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16