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 :wink:
Version imprimable
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 :wink:
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 :wink:
ben tu n'as pas tout a fait tort :P 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.Citation:
il faut seulement que l'utilisateur rentre une lettre et pas une chaine
Façon pas portable (parait-il) :Citation:
et cette lettre doit etre compris dans un intervalle : entre b et p par exemple
Façon portable :Code:
1
2 if ((c < 'b') || (c > 'p')) // Erreur...
Code:
1
2
3 std::string Valide = "bcdefghijklmnop"; if (Valide.find(c) == std::string::npos) // Erreur...
je teste ca ce soir merci :)
Pas portable car valable qu'en ASCII, pas EBCDIC.Code:
1
2 if ((c < 'b') || (c > 'p')) // Erreur...
Voir ici par exemple.
Merci pour l'info ;)Citation:
Envoyé par Trap D
Dans quel genre d'environnement travaille-t-on en EBCDIC ?
C'est utilisé par IBM :
cf : làCitation:
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é. :wink:
:? cela marche en effet pour les caractères :D 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 compilationsCode:
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 8O si quelqu'un pouvait m'eclairer :oops:Code:
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.
en effet merci beaucoup :wink: 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:
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.Citation:
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 ?Citation:
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
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:
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; }
probleme resolu :D