J'ai déjà honte tellement ca doit être facile....

J'ai déjà honte tellement ca doit être facile.... - C++ - Programmation

Marsh Posté le 12-03-2003 à 09:54:38    

Hello !
 
Voila un code tout simple qui devrait me permettre de convertir un char * en int (de buffer vers result). Mais le truc a un comportement complètement abérant...C'est surement un truc tout con, mais la je vois pas du tout...
 

Code :
  1. #include <windows.h>    // DWORD, BOOL, Registry API's
  2. #include <stdio.h>
  3. #include <iostream.h>
  4. int main(int argc, char* argv[])
  5. {
  6. char buffer[16]="120a  3 456789";;
  7. cout <<buffer<<endl;;
  8.  int i,nbc,factor,result,j;
  9.  j=0;
  10.  factor=1;
  11.  result=0;
  12.  nbc=0;
  13.  for (i=0;i<15;i++)
  14.  {
  15.   if ( (strcmp (&buffer[i],"0" ) >= 0 ) && (strcmp (&buffer[i],"9" ) <= 0 ))
  16.   {
  17.    nbc++;
  18.   }
  19.  }
  20.  cout<<"Nombre digits : "<<nbc;
  21.  for (i=0;i<nbc-1;i++)
  22.  {
  23.   factor*=10;
  24.  }
  25.  cout<<endl<<"Facteur : "<<factor<<endl;
  26.  char c;
  27.  for (i=0;i<15;i++)
  28.  {
  29.   if ( (strcmp (&buffer[i],"0" ) >= 0 ) && (strcmp (&buffer[i],"9" ) <= 0 ))
  30.   {
  31.    int digit=1;
  32.    if (strcmp(&buffer[i],"0" ) == 0)
  33.    {
  34.     digit=0;
  35.    }
  36.    if (strcmp(&buffer[i],"1" ) == 0)digit=1;
  37.    if (strcmp(&buffer[i],"2" ) == 0)digit=2;
  38.    if (strcmp(&buffer[i],"3" ) == 0)digit=3;
  39.    if (strcmp(&buffer[i],"4" ) == 0)digit=4;
  40.    if (strcmp(&buffer[i],"5" ) == 0)digit=5;
  41.    if (strcmp(&buffer[i],"6" ) == 0)digit=6;
  42.    if (strcmp(&buffer[i],"7" ) == 0)digit=7;
  43.    if (strcmp(&buffer[i],"8" ) == 0)digit=8;
  44.    if (strcmp(&buffer[i],"9" ) == 0)digit=9;
  45.    //else cout<<"Err";
  46.    cout <<endl<<"Buffer : "<<buffer[i]<<" et Digit : "<<digit<<"     Facteur : "<<factor;
  47.    result+=digit*factor;
  48.    factor/=10;
  49.   }
  50.  }
  51.  cout<<endl<<endl<<"Resultat : "<<result;
  52.  char t[3]=" 2";
  53.  if (strcmp(&buffer[1],"2" )==0)cout<<endl<<"CA alors"<<endl;
  54.  cout<<endl<<buffer;
  55. }

Reply

Marsh Posté le 12-03-2003 à 09:54:38   

Reply

Marsh Posté le 12-03-2003 à 10:02:12    

&buffer[i]
c'est pas ca le probleme?
=> buffer[i]

Reply

Marsh Posté le 12-03-2003 à 10:04:13    

Ben le prototype de strcmp donne deux const char * en param...donc non : 'strcmp' : cannot convert parameter 1 from 'char' to 'const char *'
 
EDIT :  
 
Je viens d'essayer d'ajouter  

Code :
  1. char t[3]=" 2";
  2. if (strcmp(&t[1],"2" )==0)cout<<endl<<"CA MARCHE A LA FIN SEULEMENT !!!!!!"<<endl;


 
Et ben ca ca marche...Pourquoi pas les autres, sauf le dernier caractère...A vous de me le dire


Message édité par gooopil le 12-03-2003 à 10:11:05
Reply

Marsh Posté le 12-03-2003 à 10:27:26    

Gooopil a écrit :

 

Code :
  1. char t[3]=" 2";
  2. if (strcmp(&t[1],"2" )==0)cout<<endl<<"CA MARCHE A LA FIN SEULEMENT !!!!!!"<<endl;


 
Et ben ca ca marche...Pourquoi pas les autres, sauf le dernier caractère...A vous de me le dire


 
et

Code :
  1. char t[3]=" 2";
  2. if (strcmp(&t[0]," " )==0)cout<<endl<<"CA MARCHE A LA FIN SEULEMENT !!!!!!"<<endl;


 
ca va pas ca!???

Reply

Marsh Posté le 12-03-2003 à 10:31:00    

Ah ben non, ca marche po ca (strcmp(&t[0]," " )==0)....Arf je comprend pas....
 
 
Je vous laisse trouver la solution pendant que je vais en cours. Y'a intérêt à ce que ce soit résolu à midi c bien compris ?  ;)


Message édité par gooopil le 12-03-2003 à 10:34:45
Reply

Marsh Posté le 12-03-2003 à 11:14:22    

Il y a surtout un très gros boulot de réécriture pour que ce code soit plus simple et plus lisible.
 
D'abord pour comparer 2 caractères, on n'utilise pas strcmp (qui, je rappelle permet de comparer 2 chaines de caractères complètes) : on compare les caractères, tout simplement !
Donc n'écris pas

Code :
  1. if ( (strcmp (&buffer[i],"0" ) >= 0 ) && (strcmp (&buffer[i],"9" ) <= 0 ))

mais

Code :
  1. if (buffer[i] >= '0'  &&  buffer[i] <= '9')

. Plus simple, non ?
 
Ensuite, pour convertir le caractère en chiffre, la méthode la plus simple est d'écrire

Code :
  1. digit = (int) buffer[i] - (int) '0';

au lieu de ta cascade de ifs.
La seule chose que suppose ce code est que le codage des chiffres est contigu dans la table de caractères.
 
Enfin, deux des trois boucles sont inutiles dans ton main. Tu peux convertir ta chaine en entier avec une seule boucle, comme suit :

Code :
  1. const int   maxLen      = 15;
  2. const char  endOfString = '\0';
  3. int   number = 0;
  4. char  digit  = buffer[0];
  5. if (digit != endOfString) {
  6.   int   i = 0;
  7.   do {
  8.     if (digit >= '0'  &&  digit <= '9') {
  9.       number = 10 * number + (digit - '0');
  10.     }
  11.     else {
  12.       // Erreur. Quitter la boucle.
  13.       break;
  14.     }
  15.     i++;
  16.     digit = buffer[i];
  17.   } while (i < maxLen  ||  digit != endOfString);
  18. }


Message édité par BifaceMcLeOD le 12-03-2003 à 11:17:05
Reply

Marsh Posté le 12-03-2003 à 11:53:11    

j'en connais un qui va etre content

Reply

Marsh Posté le 12-03-2003 à 12:21:25    

Hehe moi aussi j'en connais un qui est content. Merci pour l'aide, je vais essayer tout ca :)
 
Ca faisait plus de deux ans que j'avais pas touché au C++ et ben c laborieux ;)
 
Edit : Ayé ca marche :D


Message édité par gooopil le 12-03-2003 à 12:42:20
Reply

Sujets relatifs:

Leave a Replay

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