depassement de INT_MAX lors d'un controle de saisie

depassement de INT_MAX lors d'un controle de saisie - C - Programmation

Marsh Posté le 06-12-2003 à 13:25:23    

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

---------------
.
Reply

Marsh Posté le 06-12-2003 à 13:25:23   

Reply

Marsh Posté le 06-12-2003 à 13:30:15    

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

Reply

Marsh Posté le 06-12-2003 à 13:32:29    

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  :)


---------------
.
Reply

Marsh Posté le 06-12-2003 à 13:32:41    

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

Reply

Marsh Posté le 06-12-2003 à 13:33:09    

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 ?

Reply

Marsh Posté le 06-12-2003 à 13:34:27    

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 ;)


---------------
.
Reply

Marsh Posté le 06-12-2003 à 13:35:08    

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

---------------
.
Reply

Marsh Posté le 06-12-2003 à 13:36:56    

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

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

Reply

Marsh Posté le 06-12-2003 à 13:38:15    

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

---------------
.
Reply

Marsh Posté le 06-12-2003 à 13:39:59    

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

Reply

Marsh Posté le 06-12-2003 à 13:39:59   

Reply

Marsh Posté le 06-12-2003 à 13:41:31    

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"


---------------
.
Reply

Marsh Posté le 06-12-2003 à 13:43:44    

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

Reply

Marsh Posté le 06-12-2003 à 13:46:32    

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 :(


---------------
.
Reply

Marsh Posté le 06-12-2003 à 13:51:21    

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

Reply

Marsh Posté le 06-12-2003 à 13:53:39    

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


---------------
.
Reply

Marsh Posté le 06-12-2003 à 13:55:36    

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.

Reply

Marsh Posté le 06-12-2003 à 13:56:57    

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

---------------
.
Reply

Marsh Posté le 06-12-2003 à 13:57:55    

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

Reply

Marsh Posté le 06-12-2003 à 13:58:39    

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 ;)


---------------
.
Reply

Marsh Posté le 06-12-2003 à 14:00:53    

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

Reply

Marsh Posté le 06-12-2003 à 14:01:34    

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

---------------
.
Reply

Marsh Posté le 06-12-2003 à 14:04:07    

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.

Reply

Marsh Posté le 06-12-2003 à 14:04:46    

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 ;)


---------------
.
Reply

Marsh Posté le 06-12-2003 à 14:14:27    

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
Reply

Marsh Posté le 06-12-2003 à 14:16:54    

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 ?


---------------
.
Reply

Marsh Posté le 06-12-2003 à 14:17:00    

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
Reply

Marsh Posté le 06-12-2003 à 14:19:18    

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
Reply

Marsh Posté le 06-12-2003 à 14:19:58    

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

---------------
.
Reply

Marsh Posté le 06-12-2003 à 14:20:16    

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é!  --
Reply

Marsh Posté le 06-12-2003 à 14:21:01    

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++  :(


---------------
.
Reply

Marsh Posté le 06-12-2003 à 14:22:52    

Didier1809 a écrit :


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

un coup de batte bien sentie

Reply

Marsh Posté le 06-12-2003 à 14:24:08    

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é!  --
Reply

Marsh Posté le 06-12-2003 à 14:28:04    

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é!  --
Reply

Marsh Posté le 06-12-2003 à 14:28:38    

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
Reply

Marsh Posté le 06-12-2003 à 14:30:54    

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

Reply

Marsh Posté le 06-12-2003 à 14:32:55    

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é!  --
Reply

Marsh Posté le 06-12-2003 à 14:34:14    

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 :(


---------------
.
Reply

Marsh Posté le 06-12-2003 à 14:34:46    

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

Reply

Marsh Posté le 06-12-2003 à 14:35:03    

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 ;)


---------------
.
Reply

Marsh Posté le 06-12-2003 à 14:35:35    

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]


---------------
.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed