Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1347 connectés 

  FORUM HardWare.fr
  Programmation
  C

  depassement de INT_MAX lors d'un controle de saisie

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

depassement de INT_MAX lors d'un controle de saisie

n°584419
didier1809
${citation_perso}
Posté le 06-12-2003 à 13:25:23  profilanswer
 

bonjour, c'est une bete fonction de saisie d'entier, tout marche, sauf le test de depassement de capacité, (ici, i<999999) completemt foireux.
 
je me demandait d'ou cela venait ??
 
ps : oubliez les melanges c/c++, et autres truc  ;)  :jap:  
 
 
 
 

Code :
  1. int fEntier (void) {
  2.    int i=0,cptm=0,cpt=0;
  3.    char ch;
  4.    int mark = 0;
  5.    printf("Veuillez entrer un nombre \n" );
  6.    while (ch!=13){//13 : carriage return
  7.    ch=getch();
  8.    if (ch == 45 && cpt==0){//45 : "-"
  9.     cptm++;
  10.     if (i==0 && ch==45 && cptm==1 && cpt==0) putch(ch);
  11.     mark = 1;
  12.    }//48 : 0
  13.    else if (( ch!=32)&&(isdigit(ch))&& (i <9999999)){ //32 : space
  14.     if (ch!= 48 || i!=0) putch(ch);
  15.     i = i * 10 + (ch-48);
  16.     cpt++;
  17.    }  
  18.    if (ch == 8) {//8 : backspace
  19.     i = i /10;
  20.     putch(ch);
  21.     printf(" " );
  22.     putch(ch);
  23.     if (i == 0) {
  24.   mark = 0;
  25.   cpt=0;
  26.   cptm=0;
  27.     }
  28.    }
  29.  
  30.    }
  31.    printf("/n" );  
  32.    if (mark ==1) i = -i;
  33.    return i;
  34.      
  35. }


Message édité par didier1809 le 06-12-2003 à 14:28:49

---------------
.
mood
Publicité
Posté le 06-12-2003 à 13:25:23  profilanswer
 

n°584420
Taz
bisounours-codeur
Posté le 06-12-2003 à 13:30:15  profilanswer
 

au lieu de faire du mauvais C, tu veux pas plutôt expliquer ce que tu veux faire ?

n°584422
didier1809
${citation_perso}
Posté le 06-12-2003 à 13:32:29  profilanswer
 

Taz a écrit :

au lieu de faire du mauvais C, tu veux pas plutôt expliquer ce que tu veux faire ?


 
saisir un entier, et pas de zero non significatifs, pas de -----8, pas de ++++8, le truc con, mais j'ai du mal a tester si le nombre est < que INT_MAX.
 
 
tu a des exemples ou je fait du "mauvais c" comme ca j'apprendrait un truc  :)


---------------
.
n°584423
Taz
bisounours-codeur
Posté le 06-12-2003 à 13:32:41  profilanswer
 

tiens d'ailleurs, un petit truc sympa à propos d'overflow, des petits templates fait par quelqu'un de fclc++
http://www.enseeiht.fr/~boyer/Tools.html

n°584424
Taz
bisounours-codeur
Posté le 06-12-2003 à 13:33:09  profilanswer
 

Didier1809 a écrit :


 
saisir un entier, et pas de zero non significatifs, pas de -----8, pas de ++++8, le truc con, mais j'ai du mal a tester si le nombre est < que INT_MAX.
 
 
tu a des exemples ou je fait du "mauvais c" comme ca j'apprendrait un truc  :)  

et pourquoi cin >> bidule ça te plaît pas ?

n°584425
didier1809
${citation_perso}
Posté le 06-12-2003 à 13:34:27  profilanswer
 

Taz a écrit :

tiens d'ailleurs, un petit truc sympa à propos d'overflow, des petits templates fait par quelqu'un de fclc++
http://www.enseeiht.fr/~boyer/Tools.html


 
 :jap:  mais bon, y faudrait un truc fait par moi si possible ;)


---------------
.
n°584426
didier1809
${citation_perso}
Posté le 06-12-2003 à 13:35:08  profilanswer
 

Taz a écrit :

et pourquoi cin >> bidule ça te plaît pas ?


 
j'avais des merdes avec cout//cin  :heink:  
 
j'ai toujours pas capté pourquoi, mais il me faisait certaines instructions avant de faire le cout  :??:  :heink:
 
ex :
 

Code :
  1. if (ch == 8) {//8 : backspace
  2.     i = i /10;
  3.     putch(ch);
  4.     cout<<" ";
  5.     putch(ch);


 
ca ne marche plus  :heink:


Message édité par didier1809 le 06-12-2003 à 13:36:29

---------------
.
n°584428
Taz
bisounours-codeur
Posté le 06-12-2003 à 13:36:56  profilanswer
 

mais biensur ....
 
c'est quoi le problème avec
 

Code :
  1. if (!cin >> i || i>tropGrosPourMoi)
  2. {
  3.   //Badaboum
  4. }

n°584429
didier1809
${citation_perso}
Posté le 06-12-2003 à 13:38:15  profilanswer
 

la saisie est char par char, avec ton truc, je pourais ecrire "dfgfg787" non ?
 
ps : excuse, mais je suis pas trop doué ;)


Message édité par didier1809 le 06-12-2003 à 13:38:39

---------------
.
n°584430
Taz
bisounours-codeur
Posté le 06-12-2003 à 13:39:59  profilanswer
 

euh la saisie char par char ça n'a un sens que si tu lis ne veux lire qu'un char apres l'autre. si tu veux en lire plusieurs, en char par char c'est impossible

mood
Publicité
Posté le 06-12-2003 à 13:39:59  profilanswer
 

n°584431
didier1809
${citation_perso}
Posté le 06-12-2003 à 13:41:31  profilanswer
 

je ne veut l'echo que des nombres, et du 1e "-" en fait ;)
 
j'ai le while(carriage return) qui me permet de lire jusqu'a la frappe d'"enter"


---------------
.
n°584436
Taz
bisounours-codeur
Posté le 06-12-2003 à 13:43:44  profilanswer
 

bah débrouilles toi. change le titre de ton sujet, ce que tu fais dépend trop de ton sytème. et puis j'ai toujours rien compris à ce que tu veux faire.
lis ligne par ligne et filtre par regex, c'est que je ferais

n°584438
didier1809
${citation_perso}
Posté le 06-12-2003 à 13:46:32  profilanswer
 

je vais réessaier d'expliquer le probleme alors ;)
 
j'aimeria que l'utilisateur entre un nombre, mais ne puisse pas ecrire : 000008; ----8; ++++8; +-+-+-8.
 
et bien sur, que les lettres ne soient pas prise en compte.
 
donc je doit lire char par char, pour pouvoir teter et faire l'echo ou non "put(ch)"
 
le seul probleme que j'ai, c'est quand "i" depasse la valeur max d'un int :(


---------------
.
n°584440
Taz
bisounours-codeur
Posté le 06-12-2003 à 13:51:21  profilanswer
 

et en quoi
 

Code :
  1. if(! cin >> i) { cerr << "essaie encore" }

n'est pas bon ? si ce n'est que le mec a encore la possibilité de voir ce qu'il tappe. si tu supprimes l'echo à la frappe, ton utilisateur n'arrivera jamais a entrer quelque chose de valide.
 
 
comme déjà posté ici plusieurs fois
 

Code :
  1. #include <iostream>
  2. #include <limits>
  3. #include <sstream>
  4. #include <string>
  5. using namespace std;
  6. int main()
  7. {
  8.   int i;
  9.  
  10.   for( ; ; )
  11.     {
  12.       cout << "1) saisissez un entier : " << flush;
  13.      
  14.       if( cin >> i )
  15. {
  16.   break;
  17. }
  18.       else if(cin.bad())
  19. {
  20.   cerr << "Erreur d\'E/S" << endl;
  21.   return 1;
  22. }
  23.       else if (cin.eof())
  24. {
  25.   cout << endl << "EOF, Bye" << endl;
  26.   return 0;
  27. }
  28.       else
  29. {
  30.   cin.clear();
  31.   cin.ignore(numeric_limits<int>::max(), '\n');
  32.     }
  33.   cout << "1) voila l'entier : " << i << endl;
  34.   cin.ignore(numeric_limits<int>::max(), '\n');
  35.   for( ; ; )
  36.     {
  37.       cout << "2) saisissez un entier : " << flush;
  38.       string s;
  39.       if(getline(cin, s))
  40. {
  41.   istringstream is(s);
  42.   if( is >> i )
  43.     {
  44.       break;
  45.     }
  46. }
  47.       else if(cin.bad())
  48. {
  49.   cerr << "Erreur d\'E/S" << endl;
  50.   return 1;
  51. }
  52.       else if (cin.eof())
  53. {
  54.   cout << endl << "EOF, Bye" << endl;
  55.   return 0;
  56. }
  57.     }
  58.      
  59.  
  60.   cout << "2) voila l'entier : " << i << endl;
  61. }

tu as tout dans les istream pour lire correctement une entrée

n°584445
didier1809
${citation_perso}
Posté le 06-12-2003 à 13:53:39  profilanswer
 

justement je ne supprime l'echo que dans les cas qu'il ne m'interesse pas ;)
 
essaie ma fonction, tu comprendra mieux ;)


---------------
.
n°584447
Taz
bisounours-codeur
Posté le 06-12-2003 à 13:55:36  profilanswer
 

ta fonction ne fonctionne pas blaireau :o, ne compile pas, etc
 
un echo ça supprime pas. en fait ce que tu veux, c'est que ton mec, il tappe en aveugle, et seulement si c'est bon, il a le droit de voir ce qu'il a tapé. ridicule.

n°584448
didier1809
${citation_perso}
Posté le 06-12-2003 à 13:56:57  profilanswer
 

heu, le blaireau c'est toi, ca tourne nickel chez moi ;)
 
t'a quoi comme erreurs de compil ??
 
et t'a l'echo si tu tape des bons trucs, sinon ce n'est pas prit en compte ! ;)
tien, vla l'appel de la fonction :
 
cout<<"l'entier vaut: "<<fEntier()<<endl;


Message édité par didier1809 le 06-12-2003 à 13:58:09

---------------
.
n°584449
Taz
bisounours-codeur
Posté le 06-12-2003 à 13:57:55  profilanswer
 

ça s'appelle pas un echo ça. essaie plutot mon code :o

n°584450
didier1809
${citation_perso}
Posté le 06-12-2003 à 13:58:39  profilanswer
 

Taz a écrit :

ça s'appelle pas un echo ça. essaie plutot mon code :o


 
j'ai essaié, ca marche bien  :jap: , mais c'est pas ce que je veut ;)


---------------
.
n°584452
Taz
bisounours-codeur
Posté le 06-12-2003 à 14:00:53  profilanswer
 

putain mais à partir du moment ou le mec il tape au clavier, il faut quand meme qu'il voit ce qu'il tappe. après tu valide l'entrée et passe au traitement sinon tu lui dit de recommencer :o

n°584453
didier1809
${citation_perso}
Posté le 06-12-2003 à 14:01:34  profilanswer
 

et si je ne veut pas ;)
 
comme ca il ne doit pas recommencer la saisie ;)
 
au fait, il n'y a pas d'autres conneries ecrites que les printf ?


Message édité par didier1809 le 06-12-2003 à 14:02:17

---------------
.
n°584454
Taz
bisounours-codeur
Posté le 06-12-2003 à 14:04:07  profilanswer
 

et ben tu regardes avec ton système comment empecher complètement l'écho du clavier, c'e'st à dire tu gardes un truc comme je t'ai donné, sauf que tu vires l'echo et moi je me casse de ce sujet à la noix.

n°584456
didier1809
${citation_perso}
Posté le 06-12-2003 à 14:04:46  profilanswer
 

Taz a écrit :

et ben tu regardes avec ton système comment empecher complètement l'écho du clavier, c'e'st à dire tu gardes un truc comme je t'ai donné, sauf que tu vires l'echo et moi je me casse de ce sujet à la noix.


 
tu comprend pas trop la, essaie deja de voir ce que ma focntion fait, ca t'aidera a comprendre le seul prob qu'il y a ;)


---------------
.
n°584467
ffluff
Challenge Everything
Posté le 06-12-2003 à 14:14:27  profilanswer
 

didier moi non plus je ne comprends pas ce que tu veux faire.
 
Tu voudrais faire un truc comme pour les mots de passe ?
(c'est à dire que tu entre ton password sans le voir et si il correspond bien tu continue les opérations)
c'est ca ?
et pour toi le 'truc' entré au clavier ca serais un nombre compris entre 0 et NB_MAX.
 
c'est ca ?


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
n°584470
didier1809
${citation_perso}
Posté le 06-12-2003 à 14:16:54  profilanswer
 

fFluFf a écrit :

didier moi non plus je ne comprends pas ce que tu veux faire.
 
Tu voudrais faire un truc comme pour les mots de passe ?
(c'est à dire que tu entre ton password sans le voir et si il correspond bien tu continue les opérations)
c'est ca ?
et pour toi le 'truc' entré au clavier ca serais un nombre compris entre 0 et NB_MAX.
 
c'est ca ?


 
pas excatement :/
 
en clair :
l'utilisateur se retrouve avec ca :
 
"entrez le nombre"
 
la il peut taper n'importe quoi ca n'ecrit rien, SAUF si c'est un nombre, la ca ecrit, pareil pour les 0 non diognificatif, et le "-".
 
il frappe "enter" et la fonction returne la valeur de l'entier inscrit.
 
sinon je met l'executable ici ?


---------------
.
n°584471
ffluff
Challenge Everything
Posté le 06-12-2003 à 14:17:00  profilanswer
 

ou alors tu veux que le 'truc' rentré au clavier ne soit pas d'une longeur supérieur a LONGUEUR_MAX :
 
123: longueur(123) = 3


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
n°584473
ffluff
Challenge Everything
Posté le 06-12-2003 à 14:19:18  profilanswer
 

ok je crois que j'ai compris :
"entrez le nombre :" si je tape 'a' rien ne s'affiche  
si je tape '1' j'ai '1' qui s'affiche si je tape ensuite b y a toujours que '1' d'affiché et si je tape '2' la y a '12' d'affiché.


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
n°584475
didier1809
${citation_perso}
Posté le 06-12-2003 à 14:19:58  profilanswer
 

fFluFf a écrit :

ok je crois que j'ai compris :
"entrez le nombre :" si je tape 'a' rien ne s'affiche  
si je tape '1' j'ai '1' qui s'affiche si je tape ensuite b y a toujours que '1' d'affiché et si je tape '2' la y a '12' d'affiché.


 
voila  :jap:  :jap:
edit : tout marche, a part le test si le nombre depasse int_max ;)


Message édité par didier1809 le 06-12-2003 à 14:20:27

---------------
.
n°584476
gilou
Modérateur
Modzilla
Posté le 06-12-2003 à 14:20:16  profilanswer
 

Didier1809 a écrit :


ps : oubliez les melanges c/c++, et autres truc  ;)  :jap:  
 


Ben alors postes ca en C.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°584478
didier1809
${citation_perso}
Posté le 06-12-2003 à 14:21:01  profilanswer
 

gilou a écrit :


Ben alors postes ca en C.
A+,


 
c'et que je fait pas trop la diff entre le c et le c++  :(


---------------
.
n°584480
Taz
bisounours-codeur
Posté le 06-12-2003 à 14:22:52  profilanswer
 

Didier1809 a écrit :


 
c'et que je fait pas trop la diff entre le c et le c++  :(  

un coup de batte bien sentie

n°584481
gilou
Modérateur
Modzilla
Posté le 06-12-2003 à 14:24:08  profilanswer
 

D'autre part, si tu veux pas voir ce que l'utilisateur saisit, il va falloir que tu geres ca au niveau console ou interface graphique, et ca devient donc totallement dependant de ton OS et ou toolkit graphique.
Bon, tu as la solution cheap de reecrire a chaque caractere tapé par l'utilisateur, c'est la gestion console minimale.
A+,


Message édité par gilou le 06-12-2003 à 14:26:04

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°584485
gilou
Modérateur
Modzilla
Posté le 06-12-2003 à 14:28:04  profilanswer
 

Didier1809 a écrit :


 
c'et que je fait pas trop la diff entre le c et le c++  :(  


Ben alors je le met directos en C, sinon tu risque la fatwa des emirs du C++, et c'est terrible :/
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°584486
ffluff
Challenge Everything
Posté le 06-12-2003 à 14:28:38  profilanswer
 

heyhehyehyehy j'ai compris je suis trop fort :D
 
 
sinon pour ton nombre qui depasse pas MAX bah tu pourrais faire par exemple :
a chaque fois que le mec rentre un nombre tu le mets en fin d'une chaine de caractère:
tape au clavier 1
str = '1'
tape au clavier 2
str = '12'
et quand le mec tape sur entré
tu converti str en entier (avec strtok ou un truc du genre)
et op c'est gagné


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
n°584488
Taz
bisounours-codeur
Posté le 06-12-2003 à 14:30:54  profilanswer
 

pour quoi tu désactives pas l'echo clavier une bonne fois pour toute, tu lis, et si c'est un nombre et pas trop gros tu affiches. toutes les solutions lire et "jusqu'ici ça va j'affiche" sont maladroites, fastidieuse, peu sures

n°584490
gilou
Modérateur
Modzilla
Posté le 06-12-2003 à 14:32:55  profilanswer
 

Didier1809 a écrit :


 
voila  :jap:  :jap:
edit : tout marche, a part le test si le nombre depasse int_max ;)


Tu comptes le nb de chiffres. Quand tu atteins celui de maxint, tu compares la valeur entree a maxint chiffre a chiffre (si c'est pas le vrai maxint, mais un truc nettement plus petit, tu peux faire la comparaison directe). Si ca depasse maxint, tu n'acceptes pas le dernier caractere tapé.
Faut gerer apres le trap de tout caractere sauf le \n qui va valider la saisie, et il faut gerer aussi la gestion en toute circonstance de la touche delete en cas de corrections.
A+,


Message édité par gilou le 06-12-2003 à 14:35:09

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°584494
didier1809
${citation_perso}
Posté le 06-12-2003 à 14:34:14  profilanswer
 

heu, y a la fonction dans le 1e post ;) tout marche, sauf si le nb est trop grand, c'est rélé avec i<99999 mais c'est pas top comme soluce :(


---------------
.
n°584495
Taz
bisounours-codeur
Posté le 06-12-2003 à 14:34:46  profilanswer
 

c'est pas bon comme solution. le fait de bloquer l'echo n'a rien à voir avec la non-bufferisation de l'entrée

n°584496
didier1809
${citation_perso}
Posté le 06-12-2003 à 14:35:03  profilanswer
 

Taz a écrit :

pour quoi tu désactives pas l'echo clavier une bonne fois pour toute, tu lis, et si c'est un nombre et pas trop gros tu affiches. toutes les solutions lire et "jusqu'ici ça va j'affiche" sont maladroites, fastidieuse, peu sures


 
parce que l'utilisateur doit quand meme voir les nombre qu'il entre ;)


---------------
.
n°584498
didier1809
${citation_perso}
Posté le 06-12-2003 à 14:35:35  profilanswer
 

gilou a écrit :

D'autre part, si tu veux pas voir ce que l'utilisateur saisit, il va falloir que tu geres ca au niveau console ou interface graphique, et ca devient donc totallement dependant de ton OS et ou toolkit graphique.
Bon, tu as la solution cheap de reecrire a chaque caractere tapé par l'utilisateur, c'est la gestion console minimale.
A+,


 
j'ai choisit la version "cheap" [:joce]


---------------
.
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  depassement de INT_MAX lors d'un controle de saisie

 

Sujets relatifs
[CMD] Saisie de parametre par l'utilisateur ?Test de contrôle serveur apache
commande pour la saisie d'un paramètre ?[MFC] Saisie de texte dans une fenêtre d'appli SDI
[Delphi] Afficher le resultat d'une operation dans un controle EditContrôle de saisie
[Javascript] Forcer la saisie en majuscules[access] controle active X
[win32][newbie] Empecher un controle edit d'afficher son menu 
Plus de sujets relatifs à : depassement de INT_MAX lors d'un controle de saisie


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR