OVH Cloud OVH Cloud

Tester type variable entrée

47 réponses
Avatar
Rudy
Bonjour,

J'aimerai faire une action en fonction du type de la variable enregistrée
avec un cin.

Ainsi, si c'est un entier, il se passe quelque chose, sinon il se passe
autre chose ...

Merci d'avance !!

@+

Rudy

7 réponses

1 2 3 4 5
Avatar
Vincent Lascaux
Notamment "^s*[+-]?d+s*$" ; pour moi c'est un truc qu'on a écrit et
qu'il faut après remplacer par ce qu'on veut ! MDRRR !


replace("/[^A-Za-z]([Mm][Dd][Rr]+)|([Ll][Oo][Ll]+)[^A-Za-z]/", "");

--
Vincent

Avatar
Fabien LE LEZ
On Thu, 24 Mar 2005 08:45:05 +0100, "Alexandre"
:

En général, ça ne vaut pas la peine d'écrire un parseur pour des
choses aussi simple.


et regex, ce n'est pas (en quelque sorte) un parseur ? ;-)


Oui, mais déjà écrit.


--
;-)


Avatar
kanze
Fabien LE LEZ wrote:
On 23 Mar 2005 03:26:06 -0800, :

entier( "^s*[+-]?d+s*$" ) ;


Ça me paraît bizarre comme expression (mais je ne connais pas
la version Boost des regex). C'est pas plutôt
"^s*[+-]?d+s*$" ?


En effet. Il faut doubler les dans la chaîne, afin qu'ils y
soient et que boost::regex puisse les lire. Je pensais
effectivement à ce qu'il fallait donner à boost::regex.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Rudy
replace("/[^A-Za-z]([Mm][Dd][Rr]+)|([Ll][Oo][Ll]+)[^A-Za-z]/", "");


Non non, quand je dis que je ne comprends pas, c'est pas que je comprendrai
mieux un équivalent avec des symbles des plus bizarres pour moi !!
Franchement, je ne comprends pas plus ce que tu viens d'écrire que ce qu'il
y avait avant ! C'est du vrai charabia pour moi ! Ou, à la limite, du
chinois parce que ce sont les mêmes symboles ... lol

Mais est-ce que vous me confirmez qu'il n'existe vraiment AUCUN moyen de
faire ce que je veux avec un if ou un while ???

Merci

@+

Avatar
Pierre Maurette
replace("/[^A-Za-z]([Mm][Dd][Rr]+)|([Ll][Oo][Ll]+)[^A-Za-z]/", "");



Non non, quand je dis que je ne comprends pas, c'est pas que je comprendrai
mieux un équivalent avec des symbles des plus bizarres pour moi !!
Franchement, je ne comprends pas plus ce que tu viens d'écrire que ce qu'il
y avait avant ! C'est du vrai charabia pour moi ! Ou, à la limite, du
chinois parce que ce sont les mêmes symboles ... lol

Mais est-ce que vous me confirmez qu'il n'existe vraiment AUCUN moyen de
faire ce que je veux avec un if ou un while ???


C'est du C, désolé.
Ça respecte votre "cahier des charges":
"En fait, tu as bien dit ce que je voudrais faire : analyser une chaîne
pour voir qi elle ne contient que des chiffres ou non ... Et ensuite,
faire une action s'il n'y a pas que des chiffres, une autre s'il n'y a
que des chiffres ..."


#include <iostream>
#include <ctype.h>
#include <stdlib.h>

int main()
{
std::string ligne;
std::cin >> ligne;

bool EstNombre = true;
int i = 0, ValeurSaisie = -1;
char c;

while((c = ligne.c_str() [i++]) != '')
{
if(!isdigit(c))
{
EstNombre = false;
break;
}
}

if(EstNombre)
{
ValeurSaisie = atoi(ligne.c_str());
std::cout << "Nombre" << std::endl;
std::cout << ValeurSaisie << std::endl;
}
else
{
std::cout << "Pas Nombre" << std::endl;
}
return 0;
}
--
Pierre


Avatar
Vincent Lascaux
replace("/[^A-Za-z]([Mm][Dd][Rr]+)|([Ll][Oo][Ll]+)[^A-Za-z]/", "");


Non non, quand je dis que je ne comprends pas, c'est pas que je
comprendrai mieux un équivalent avec des symbles des plus bizarres pour
moi !!
Franchement, je ne comprends pas plus ce que tu viens d'écrire que ce
qu'il y avait avant ! C'est du vrai charabia pour moi ! Ou, à la limite,
du chinois parce que ce sont les mêmes symboles ... lol


C'est des expressions régulières. C'est super pratique, mais assez peu
lisible. Sauf erreur, ce que j'ai écrit permet de supprimer les MdRRR et
autres lOlllLL d'un message (c'est juste que souvent j'ai du mal à
comprendre ce qui peu bien déclencher une telle excitation zygomatique).

Mais est-ce que vous me confirmez qu'il n'existe vraiment AUCUN moyen de
faire ce que je veux avec un if ou un while ???


On t'a parlé de tester l'état d'un flux type stringstream apres avoir tenté
d'y avoir lu la variable...
Tu peux aussi aller voir boost qui te permet de faire boost::lexical_cast<
TonType >(taChaine), et qui lance une exception s'il n'y arrive pas.

--
Vincent


Avatar
James Kanze
Rudy wrote:
Dans la pratique, pas directement. Mais si on connaît cin, on
connaît les flux, et Ivan et moi avons tous les deux proposé
des solutions à base des flux.



Oui, mais je ne connais pa du tout les syntaxes que vous
m'avez proposé. Alors que if(!cin), je connais très bien ...
lol


Quels syntaxes ? J'ai bien cité la solution avec expressions
régulières, mais en disant que c'était peut-être un peu trop
avancé pour toi. L'autre solution que j'ai proposé n'utilise
aucun syntaxe plus compliqué que « if ( flux ) » ; celui d'Ivan
était même plus simple à suivre, parce qu'il sortait tous les
tests dans les variables séparées.

Si tu ne comprends pas la solution qu'a proposé Ivan, pose des
questions sur ce que tu n'as pas compris, parce que c'est
certainement à ton niveau. AMHA, ma solution sans expressions
régulières aussi, mais il faut plus d'explications quand même.

Je dois ajouter que les solutions de Ivan et de moi (avec
getline, puis >> pour parser la ligne), sont vraiment les
solutions idiomatiques du C++ ; c'est la façon normale de
procéder.

Donc si vous conniassez une solution qui utilise des boucles
simples, je préfèrerai vraiment : je serai totalement
incapable d'expliquer le reste !


Notamment "^s*[+-]?d+s*$" ; pour moi c'est un truc qu'on a
écrit et qu'il faut après remplacer par ce qu'on veut ! MDRRR
!


C'est à peu près ça. La spécification du texte à chercher se
fait au moyen d'une expression régulière. Il existe des classes
d'expression régulière tout faite, où tu n'as qu'à spécifier ce
que tu veux chercher. Tu spécifies une ligne légale. Tu
appliques l'expression régulière à la ligne. Si tu trouves,
c'est que la syntaxe de la ligne était bonne. Sinon, elle était
mauvaise.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34


1 2 3 4 5