[C] Conversion nombre hexa en decimal

Conversion nombre hexa en decimal [C] - C - Programmation

Marsh Posté le 28-10-2004 à 22:06:17    

Slt, voici le code
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define OUI 1
  4. #define NON 0
  5. int htoi(char s[]);
  6. int main()
  7. {
  8.     char* s;
  9.    
  10.     s = malloc(50 * sizeof(char));
  11.    
  12.     printf("Saisir un nombre hexadécimal: " );
  13.     fgets(s, 50, stdin);
  14.    
  15.     printf("Le nombre hexa %x vaut %d\n", s, htoi(s));   
  16.    
  17.     system("PAUSE" );
  18.     return 0;
  19. }
  20. /* htoi : convertit en entier une chaine s hexa                             */
  21. int htoi(char s[])
  22. {
  23.     int chiffre_hexa, i, dans_hexa, n;
  24.    
  25.     i = 0;
  26.     if (s[i] = '0') {        /* passe 0x ou 0X optionnel                    */
  27.         ++i;
  28.         if (s[i] == 'x' || s[i] == 'X')
  29.             ++i;
  30.     }             
  31.     n = 0;                    /* valeur entière à renvoyer                   */
  32.     dans_hexa = OUI;          /* suppose chiffre héxa correcte               */
  33.     while (dans_hexa == OUI) {
  34.         if (s[i] >= '0' && s[i] <= '9') {
  35.             chiffre_hexa = s[i] - '0';
  36.         } else if (s[i] >= 'a' && 'f') {
  37.             chiffre_hexa = s[i] - 'a' + 10;    /*  a vaut 10 en décimal     */
  38.         } else if (s[i] >= 'A' && 'F') {               
  39.             chiffre_hexa = s[i] - 'A' + 10;
  40.         } else dans_hexa = NON;                /* chiffre hexa incorrect    */
  41.         if (dans_hexa == OUI) {
  42.             n = 16 * n + chiffre_hexa;       
  43.         ++i;
  44.         }   
  45.     }
  46.     return n;
  47. }


 
Voici ce que j'ai en retour:
 

Citation :


Saisir un nombre hexadÚcimal: 0xaa
Le nombre hexa 3d2498 vaut 170
Appuyez sur une touche pour continuer...


 
3d2498 >> y vient de ou ce nombre????

Citation :


Reply

Marsh Posté le 28-10-2004 à 22:06:17   

Reply

Marsh Posté le 28-10-2004 à 22:13:09    

%s, pas %x.
 
Je laisse Taz te démonter le reste du code (de sizeof(char) à if (dans_hexa == OUI).

Reply

Marsh Posté le 28-10-2004 à 22:21:19    

Ok j'ai changé mais j'ai encore un soucis.
 

Citation :


Saisir un nombre hexadÚcimal: 0xaa
Le nombre hexa 0xaa
 vaut 170
Appuyez sur une touche pour continuer...


 
Pourquoi ya un retour a la ligne en plein milieu?
 
Aussi non ,tan que j'y suis, est ce que le prrgramme est bien codé, au novo déclaration des variables, et est ce qu'on est tjs obligé d'allouer de la mémoire pour les char? car perso j'ai réserver 50 octets mais c pas pratique car ca depend de ce qu'on rentre en entrée.

Reply

Marsh Posté le 28-10-2004 à 22:25:36    

ce que je vois surtout, c'est que DonQuichotte a du raté un truc dans 'allocation dynamique' pour coder un beau '50'
 
du reste manque un fflush(stdout), un const sur ton htoi
 
et t'es pas très cohérent dans tes tests ... relis toi avant de poster :o
 
à moins que ça soit a but didactique, utilise strtol.
t'aurais quand même pu utiliser isdigit/isxdigit/etc ..

Reply

Marsh Posté le 28-10-2004 à 22:25:55    

tu recupere le '\n' avec fgets
 
pouquoi tu fais une alloc dynamique pour s ?

Reply

Marsh Posté le 28-10-2004 à 22:30:53    

en fait, c'est variable de contrôle de boucle, c'est génial pour bien obfuscquer le tout ... alors qu'une bonne boucle while(isxdigit(s[i])) c'est tellement plus jolie ...
 
je dirais pas non non-plus à un while(*s) avec un break bien senti... la le nom de la var est sybilin, et il faut tracer son utilisation pour comprendre ce qu'il se passe. saloperie de pascal

Reply

Marsh Posté le 28-10-2004 à 22:31:56    

Dsl mais je connnais pas toutes ces fonction: "sdigit/isxdigit/etc"  
 
Ba en fait je fais une alloc car c le seul truc que j'ai trouvé pour que le programme marche, quand je le vire, ca plante au moment de la saisi d'un nombre.  
 
Pour le fgets qui récupère le \n, ya pas moyen d'éviter ca?

Reply

Marsh Posté le 28-10-2004 à 22:35:59    

Et pis j'aime pas le code qui fait x==OUI. Pourquoi pas plutôt (x==OUI)==OUI ?  
 
Plus sérieusement, dégage moi ces 2 constantes OUI et NON, et teste directement "if(dans_hexa)".
 
Ensuite, supprime le \n que fgets te renvoie (potentiellement) en fin de chaîne.
 
Utilise isdigit, met un fflush stdout, déplace l'affectation "dans_hexa=1" à sa position correcte.
 
Et reposte ton programme pour qu'on regarde à quoi il ressemble...
 

Reply

Marsh Posté le 28-10-2004 à 22:36:20    

char s[100]; et sizeof s pour la taille

Reply

Marsh Posté le 28-10-2004 à 22:44:16    

Cervantes a écrit :

Dsl mais je connnais pas toutes ces fonction: "sdigit/isxdigit/etc"  
 
Ba en fait je fais une alloc car c le seul truc que j'ai trouvé pour que le programme marche, quand je le vire, ca plante au moment de la saisi d'un nombre.  
 
Pour le fgets qui récupère le \n, ya pas moyen d'éviter ca?

on t'as demandé d'écrire un htoi, c'est un devoir ?
 
fgets récupère un '\n' des fois, nique le avec strchr
 
documente toi, notamment sur <ctype.h> :o

Reply

Marsh Posté le 28-10-2004 à 22:44:16   

Reply

Marsh Posté le 28-10-2004 à 22:56:19    

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. int htoi(char s[]);
  5. int main()
  6. {
  7.     char s[100];
  8.    
  9.     printf("Saisir un nombre hexadécimal: " );
  10.     fgets(s, 100, stdin);
  11.    
  12.     printf("Le nombre hexa %s vaut %d\n", s, htoi(s));   
  13.    
  14.     system("PAUSE" );
  15.     return 0;
  16. }
  17. /* htoi : convertit en entier une chaine s hexa                             */
  18. int htoi(char s[])
  19. {
  20.     int chiffre_hexa, i, dans_hexa, n;
  21.    
  22.     i = 0;
  23.     if (s[i] = '0') {         /* passe 0x ou 0X optionnel                   */
  24.         ++i;
  25.         if (s[i] == 'x' || s[i] == 'X') {
  26.             ++i;
  27.             dans_hexa =   1;  /* suppose chiffre héxa correct               */
  28.         }   
  29.     }             
  30.     n = 0;                    /* valeur entière à renvoyer                  */
  31.     while (dans_hexa == 1) {
  32.         if (isdigit(s[i])) {
  33.             chiffre_hexa = s[i] - '0';
  34.         } else if (isxdigit(s[i])) {
  35.             chiffre_hexa = s[i] - 'a' + 10;    /*  a vaut 10 en décimal     */
  36.         } else dans_hexa = 0  ;                /* chiffre hexa incorrect    */
  37.        
  38.         if (dans_hexa == 1) {
  39.             n = 16 * n + chiffre_hexa;       
  40.         ++i;
  41.         }   
  42.     }
  43.     return n;
  44. }


 
J'ai essay" de prendre en compte vos remarques.
Par contre je comprends pas comment niker le \n avec strchr
>>The strchr() function locates the first occurrence of c, cast to char, in the string pointed to by s. The terminating null character is considered a part of the string.<<  j'ai trouvé ca sur google et je vois pas le rapport avec mon cas.
 
Autre chose,
 

Citation :


char s[100]; et sizeof s pour la taille


la je veux bien, mais si je veux pas définir la taille, c possible? et pourquoi mettre un sizeof? le [100] ne définit pas déja la taille?


Message édité par cervantes le 28-10-2004 à 23:01:12
Reply

Marsh Posté le 28-10-2004 à 23:00:41    

tu veux pas commencer à nous répondre ?
 
strchr t'aide à trouver l'\n'
 
à jamais

Reply

Marsh Posté le 28-10-2004 à 23:02:52    

Alors, strchr(s, '\n') te renverra la position du retour chariot. Tu n'as qu'à mettre un 0 à la place, et hop, le tour est joué.
 
D'autre part, ARRETE de comparer dans_hexa à 1. C'est un peu incorrect. Il est préférable de faire z
"if (dans_exa)".
 
Ensuite, tu dois mettre un "fflush(stdout)" juste après ton printf, pour garantir que la ligne s'affichera à l'écran.
 
 
Ensuite, if (s[i] =0), ça me parrait louche.
 
Ensuite, ton code ne fonctionne pas pour les lettre ABCDEF en majuscules.
 
Ensuite, ton code a un fonctionnement bizarre pour
OZ12 ou 0018.
 

Reply

Marsh Posté le 28-10-2004 à 23:05:35    

Cervantes a écrit :

[cpp]
Autre chose,
 

Citation :


char s[100]; et sizeof s pour la taille


la je veux bien, mais si je veux pas définir la taille, c possible? et pourquoi mettre un sizeof? le [100] ne définit pas déja la taille?


 
tu fais ce que tu veux, le jours ou tu fera autre chose que des hello world ou autre reinventage de roulette faudra pas pleurer quand ton programme plantera lamentablement parce que ta changer la taille de ton tableau en oubliant de changer le nombre magique à un endroit critique

Reply

Marsh Posté le 28-10-2004 à 23:15:11    

Ba le code marchait avant quand j'avais mis:

Code :
  1. if (s[i] >= 'A' && s[i] <= 'F')
  2.     chiffre_hexa = s[i] - 'A' + 10;


 
donc ca voudrait dire que isxdigit ne prend en compte que les minuscules.
 
Pour revenir au strchr, a quoi ca va me servir d'avoir la position du retour chariot.
 
J'ai mis "fflush(stdout)" comme tu me le conseille mais ca change rien. Il me semle d'ailleur que mon prof m'avait dit qu'il fallait pas utiliser fflush, car defois ca a des comportements pas prévisible.
 
SI tu rentre 0Z12, c'est normal que ca renvoit 0 car ce n'est pas un nombre hexa.

Reply

Marsh Posté le 28-10-2004 à 23:20:23    

strchr te dit ou mettre ton '\0'
 
et fflush() n'a rien d'imprevisible sur un flux de sortie

Reply

Marsh Posté le 28-10-2004 à 23:22:09    

cricri > tu peux lui demander pourquoi il veut pas utiliser strtol ?

Reply

Marsh Posté le 28-10-2004 à 23:24:13    

pourquoi tu veux  pas utiliser strtol ?

Reply

Marsh Posté le 28-10-2004 à 23:25:31    

Etant donné que j'ai trop du mal avec ce strchr, je vais virer fgets et foute le bon vieux scanf, comme ca j'aurais pu ce '\n' qui fasse chier.
 
 
strtol>>> ca sert à rien je sais pas m'en servir


Message édité par cervantes le 28-10-2004 à 23:27:59
Reply

Marsh Posté le 28-10-2004 à 23:35:34    

lis les doc
 
c'est antiproductif comme raisonnement

Reply

Marsh Posté le 28-10-2004 à 23:50:22    

c'est surtout trop con oui. si tu sais pas lire/utiliser, c'est même pas la peine de coder ...
 
genre si t'es pas capable de faire un simple
 

Code :
  1. char *eol = strchr(string, '\n');
  2. if(eol) *eol = '\0';

c'est quand même vachment compliqué mais peut être pas autant que
 

Code :
  1. int i = strtol(string, NULL, 16);


 
allez, vas-y, dis moi que je te traite comme de la merde

Reply

Marsh Posté le 29-10-2004 à 00:24:44    

Si ca peut te faire plaisir....
 
En tout cas juste pour dire que le C ca fait meme pas un moi que j'en fait et donc je pense pas qu'en si peu de temps je sois capable d'appliquer en 3min des fonctions que j'ai encore jamais vu. Ya plein de truc plus simple en C que je n'ai pas encore vu, donc pour les fonctions du genre stdrche, strtol... je les verrai en peu plus tard.
 
 
Maintenant ta peu etre raison, j'sui peu etre un vieux noob, mais sache que tout le monde n'a pas un cerveau aussi rapide que le tien....
 
 :sweat:

Reply

Marsh Posté le 29-10-2004 à 00:32:36    

ça a rien à voir. Utiliser, c'est faire un grand pas vers la compréhension. Si tu ne comprends pas comment employer strchr ou strtol, c'est qu'il te manque pas mal de bases, c'est encore un peu tôt pour aller se friter avec les pointeurs. Connaître la bibliothèque du C doit être une étape essentiel de l'apprentissage.

Reply

Marsh Posté le 29-10-2004 à 08:02:07    

Cervantes a écrit :

Ba le code marchait avant quand j'avais mis:

Code :
  1. if (s[i] >= 'A' && s[i] <= 'F')
  2.     chiffre_hexa = s[i] - 'A' + 10;


 
donc ca voudrait dire que isxdigit ne prend en compte que les minuscules.


 
J'ai la flemme de regarder, mais isxdigit devrait bien marcher pour les majuscules. Le problème, c'est que dans ce cas, tu fais un truc genre chiffre_hexa = 'A' - 'a' + 10. Et ça, ça va t'envoyer dans la mouise...
 
Maintenant, on est quand même assez secs avec toi, mais crois-moi, on veux juste que tu prennes un certain nombre d'automatismes (ou plus exactement, on veut t'éviter de prendre de mauvaise habitudes). Donc c'est un peu plus pénible au début, mais ça te servira au long terme. Ca vaut le coup de faire un ptit effort au début, de lire les docs des fonctions que l'on te donne, et tu verras...


Message édité par Lam's le 29-10-2004 à 08:03:34
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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