bonsoir
je regardais la faq c++ pour controler les saisies d'entier et j'ai essayais de faire pareil avec des caractères. cela fonctionne bien mais en rentrant un chiffre je n'ai pas la phrase de saisie incorrecte est ce normal?
merci
bonsoir
je regardais la faq c++ pour controler les saisies d'entier et j'ai essayais de faire pareil avec des caractères. cela fonctionne bien mais en rentrant un chiffre je n'ai pas la phrase de saisie incorrecte est ce normal?
merci
En fait, quoi que tu saisisses ça devrait être valide non, vu que ça pourra toujours être extrait vers un char ?
Ce ne serait pas un contrôle de longueur (pas plus d'un caractère saisi) + un contrôle de "domaine" (le caractère doit être alpha, par exemple) dont tu aurais besoin ?
Bon si je suis dans le mauvais corrige moi et précise le genre de test que tu voudrais effectuer
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
ben tu n'as pas tout a fait tort il faut seulement que l'utilisateur rentre une lettre et pas une chaine. et cette lettre doit etre compris dans un intervalle : entre b et p par exemple
Bah, parfois j'aime bien tout rentrer d'un coup avant que le programme ne me le demande (quand tu passes ton temps à rentrer des valeurs pour tester ton programme c'est plus pratique). Et puis si tu lis ton entrée à partir d'un fichier ça posera problème aussi, de limiter ainsi la taille de l'entrée. Donc à mon avis, ne te soucie pas de ça.il faut seulement que l'utilisateur rentre une lettre et pas une chaine
Façon pas portable (parait-il) :et cette lettre doit etre compris dans un intervalle : entre b et p par exemple
Façon portable :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if ((c < 'b') || (c > 'p')) // Erreur...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 std::string Valide = "bcdefghijklmnop"; if (Valide.find(c) == std::string::npos) // Erreur...
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Pas portable car valable qu'en ASCII, pas EBCDIC.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if ((c < 'b') || (c > 'p')) // Erreur...
Voir ici par exemple.
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Merci pour l'infoEnvoyé par Trap D
Dans quel genre d'environnement travaille-t-on en EBCDIC ?
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
C'est utilisé par IBM :
cf : làAbbreviation of Extended Binary-Coded Decimal Interchange Code. Pronounced eb-sih-dik, EBCDIC is an IBM code for representing characters as numbers. Although it is widely used on large IBM computers, most other computers, including PCs and Macintoshes, use ASCII codes.
P.S. Tu devrais fréquenter plus souvent le forum des ancêtres C , c'est souvent évoqué.
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
cela marche en effet pour les caractères par contre j'ai un probleme etrange. j'ai realisé un programme a l'aide de la faq de developpez.com pour saisir un nombre entre 3 et 7
rien d'original surtout en ayant lu la faq. le plus etrange est lorsque je replace le meme code dans un autre programme tout simple j'ai des erreurs de compilations
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 bool read_choice( int & N ) { cout << "Entrez un chiffre entre 3 et 7 : " ; while ( ! ( cin >> N ) || N < 3 || N > 7 ) { if ( cin.eof() ) { // ^D (^Z sous windows); Fin du flux d'entree! return false; } else if ( cin.fail() ) { cout << "Saisie incorrecte, recommencez : "; cin.clear(); cin.ignore( numeric_limits<streamsize>::max(), '\n' ); } else { cout << "Le chiffre n'est pas entre 3 et 7, recommencez : "; } } return true; // succès } int main () { int choix; if ( read_choice( choix ) ) { cout << "Vous avez choisi : " << choix << '\n'; } return 0; }
tout cela sur la ligne avec le cin.ignore si quelqu'un pouvait m'eclairer
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 warning C4003: not enough actual parameters for macro 'max' error C2589: '(' : illegal token on right side of '::' error C2143: syntax error : missing ')' before '::' syntax error : ')'
Tu es pollué par des macros définies dans certains headers windows.
Ajoute un #undef min et un #undef max juste après le dernier header windows, ça devrait aller mieux.
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
en effet merci beaucoup pourquoi cette manipulation au fait?
Juste histoire d'utiliser un std::set (ensemble) pour contrôler la saisie. Cela permet de traiter indifféremment des chiffres et des lettres avec des bornes complexes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #include<set> using namespace std; char read_choice() { static char const tab[] = "34568abcdxyz"; static const set<char> ensemble( tab, tab + sizeof tab ); for(;;) { cout << "Entrez un chiffre 3,4,5,6 ou 8 ou une lettre a,b,c,d,x,y ou z : " ; char c; cin.clear(); cin.sync(); if( ! ( cin >> c ) ) throw "char read_choice() : cin"; if( ensemble.find( c ) != ensemble.end() ) return c; } } int main () { try { cout << "Saisie : " << read_choice() << endl; } catch( char * const exception ) { cout << "\nErreur saisie (" << exception << ")\n" << endl; } }
On peut aussi définir une macro NOMINMAX avant d'inclure windows.h. Enfin c'était juste pour pinailler.Ajoute un #undef min et un #undef max juste après le dernier header windows, ça devrait aller mieux
J'ai pas saisi l'interêt d'utiliser un set pour ça, par rapport à un string. Juste le temps de recherche plus faible ?Juste histoire d'utiliser un std::set (ensemble) pour contrôler la saisie. Cela permet de traiter indifféremment des chiffres et des lettres avec des bornes complexes
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
peut on aussi verifier la saisie d'un char avec l'exemple lu dans la faq qui servait a controler un entier? qui etait
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 bool read_choice( int & N ) { cout << "Entrez un chiffre entre 3 et 7 : " ; while ( ! ( cin >> N ) || N < 3 || N > 7 ) { if ( cin.eof() ) { // ^D (^Z sous windows); Fin du flux d'entree! return false; } else if ( cin.fail() ) { cout << "Saisie incorrecte, recommencez : "; cin.clear(); cin.ignore( numeric_limits<streamsize>::max(), '\n' ); } else { cout << "Le chiffre n'est pas entre 3 et 7, recommencez : "; } } return true; // succès } int main () { int choix; if ( read_choice( choix ) ) { cout << "Vous avez choisi : " << choix << '\n'; } return 0; }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager