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

  FORUM HardWare.fr
  Programmation
  C

  [C] Conversion nombre hexa en decimal

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Conversion nombre hexa en decimal

n°885350
cervantes
Posté le 28-10-2004 à 22:06:17  profilanswer
 

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 :


mood
Publicité
Posté le 28-10-2004 à 22:06:17  profilanswer
 

n°885355
Lam's
Profil: bas.
Posté le 28-10-2004 à 22:13:09  profilanswer
 

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

n°885363
cervantes
Posté le 28-10-2004 à 22:21:19  profilanswer
 

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.

n°885368
Taz
bisounours-codeur
Posté le 28-10-2004 à 22:25:36  profilanswer
 

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 ..

n°885369
cris56
Posté le 28-10-2004 à 22:25:55  profilanswer
 

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

n°885373
Taz
bisounours-codeur
Posté le 28-10-2004 à 22:30:53  profilanswer
 

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

n°885374
cervantes
Posté le 28-10-2004 à 22:31:56  profilanswer
 

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?

n°885376
Lam's
Profil: bas.
Posté le 28-10-2004 à 22:35:59  profilanswer
 

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...
 

n°885377
cris56
Posté le 28-10-2004 à 22:36:20  profilanswer
 

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

n°885388
Taz
bisounours-codeur
Posté le 28-10-2004 à 22:44:16  profilanswer
 

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

mood
Publicité
Posté le 28-10-2004 à 22:44:16  profilanswer
 

n°885392
cervantes
Posté le 28-10-2004 à 22:56:19  profilanswer
 

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
n°885393
Taz
bisounours-codeur
Posté le 28-10-2004 à 23:00:41  profilanswer
 

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

n°885394
Lam's
Profil: bas.
Posté le 28-10-2004 à 23:02:52  profilanswer
 

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.
 

n°885396
cris56
Posté le 28-10-2004 à 23:05:35  profilanswer
 

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

n°885408
cervantes
Posté le 28-10-2004 à 23:15:11  profilanswer
 

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.

n°885415
cris56
Posté le 28-10-2004 à 23:20:23  profilanswer
 

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

n°885420
Taz
bisounours-codeur
Posté le 28-10-2004 à 23:22:09  profilanswer
 

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

n°885425
cris56
Posté le 28-10-2004 à 23:24:13  profilanswer
 

pourquoi tu veux  pas utiliser strtol ?

n°885426
cervantes
Posté le 28-10-2004 à 23:25:31  profilanswer
 

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
n°885429
cris56
Posté le 28-10-2004 à 23:35:34  profilanswer
 

lis les doc
 
c'est antiproductif comme raisonnement

n°885433
Taz
bisounours-codeur
Posté le 28-10-2004 à 23:50:22  profilanswer
 

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

n°885445
cervantes
Posté le 29-10-2004 à 00:24:44  profilanswer
 

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:

n°885450
Taz
bisounours-codeur
Posté le 29-10-2004 à 00:32:36  profilanswer
 

ç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.

n°885501
Lam's
Profil: bas.
Posté le 29-10-2004 à 08:02:07  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


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

  [C] Conversion nombre hexa en decimal

 

Sujets relatifs
Nombre maximum de fichiers ouverts par processus[C++][Drivers] Conversion d'un driver pinnacle Xp vers W2k3
[C] Probleme de conversion char -> int[c++] Conversion vector<T> en T*
[JS] compteur : nombre de checkbox cochées ?conversion str en date ou datetime
[Js] Compter le nombre de td[Struts] Nombre de champs non défini pour un formulaire
random à partir d'un nombreConversion site IE>Mozilla, PLZ help!
Plus de sujets relatifs à : [C] Conversion nombre hexa en decimal


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