J'écrivais une fonction de base en C pour convertir des entiers décimaux en hexadécimal mais je me suis trompé dans la combinaison des types de données. et j'obtiens des nombres aléatoires en sortie.
int decToHex(int b){ int bb[50]; int i=0,j=0; while(b!=0){ j=b%16; if(j>9){ char k=j+55; bb[i] = k; } else { bb[i] = j; } b = b/2; i++; } for(j=i-1; j>=0; j--){ printf("%s",bb[j]); } }
Soyez améliorés?
ci-dessous est la fonction
char k=j+55; bb[i] = k;
3 Réponses :
Il semble que vous souhaitiez créer un tableau de caractères:
3E8
Il pourrait être plus clair d'écrire
#include <stdio.h> int decToHex(int b){ char bb[50]; int i=0,j=0; while(b!=0){ j=b%16; if(j>9){ char k = j - 10 + 'A'; bb[i] = k; } else { bb[i] = j + '0'; } b = b/16; i++; } for(j=i-1; j>=0; j--){ printf("%c", bb[j]); } printf("\n"); return 0; } int main(void) { decToHex(1000); return 0; }
Et vous voulez probablement remplacer
printf("\n");
La division par 2 serait utilisée pour la conversion en binaire, vous devez diviser par 16:
printf("%c", bb[j]);
Enfin, la ligne de sortie devrait probablement être
// b = b / 2; b = b / 16;
Vous voudrez peut-être imprimer une nouvelle ligne après la boucle de sortie:
// bb[i] = j bb[i] = j + '0'
La signature de la fonction attend un retour entier, mais j'aurais besoin de plus d'informations avant de pouvoir vous dire comment résoudre ce problème. Pour l'instant, nous ne retournerons que zéro.
Avec ces changements minimes, nous obtenons
char k = j - 10 + 'A';
Production
char b[50];
oui, cela fonctionne bien. même si je veux toujours savoir si j'ai un tableau général contenant à la fois des chiffres et des caractères, comment l'imprimer.
Tout d'abord, vous devez diviser b en 16. car il est hexadécimal.
Deuxièmement, si j <= 9, vous devez ajouter «0» (code ascii 48) à j.
Et votre fonction ne renvoie rien, donc le type de retour doit être void. et bb [j] est char, pas char []. la chaîne de format doit être% c.
Solution:
#include <stdio.h> void decToHex(int b) { int bb[50]; int i = 0, j = 0; while (b != 0) { j = b % 16; char k; if (j > 9) { k = j - 10 + 'A'; } else { k = j + '0'; } bb[i] = k; b = b / 16; i++; } for (j = i - 1; j >= 0; j--) { char c = bb[j]; printf("%c", c); } }
merci, cela fonctionne bien. mais si je supprime char c=bb[j]
et modifie le dernier en printf("%c",bb[j])
, alors (par exemple) pour 100, il imprime les symboles sur les valeurs ASCII de 6 et 4. tandis que le le code plante pour les valeurs où le nombre hexadécimal doit avoir des alphabets. Le premier cas est compréhensible mais pourquoi n'imprime-t-il pas ces 6 alphabets alors qu'ils sont eux-mêmes des caractères?
Si vous souhaitez créer un tableau qui peut stocker char
et int
, nous avons besoin d'un type spécial pouvant contenir les deux. J'ai choisi une struct
avec un union
:
mixed_type.h
3E8
principal c
#include <stdio.h> #include "mixed_type.h" void decToHex(int decimal) { int hex_digits = 0, copy_decimal = decimal; while (copy_decimal) { ++hex_digits; copy_decimal /= 16; } entry_t result[hex_digits]; int index = hex_digits - 1; while (decimal) { int nibble = decimal % 16; if (nibble >= 10) { result[index].type = CHAR; result[index].letter = nibble - 10 + 'A'; } else { result[index].type = INT; result[index].number = nibble; } --index; decimal /= 16; } for (index = 0; index < hex_digits; index++) { if (result[index].type == CHAR) printf("%c", result[index].letter); else printf("%d", result[index].number); } printf("\n"); } int main(void) { decToHex(1000); return 0; }
Production
#ifndef MIXED_TYPE_H #define MIXED_TYPE_H typedef enum { CHAR = 0, INT } type_t; typedef struct { type_t type; union { int number; char letter; }; } entry_t; #endif
En plaçant le nouveau type dans un fichier d'en-tête séparé, nous pouvons le rendre plus facile à réutiliser.
"%s"
est pour les chaînes, pas pour les entiers.@ mr.loop - Vous écrivez des entiers décimaux convertis , mais ce que vous essayez en fait de convertir est la représentation interne d'un entier, qui n'est probablement pas décimal .
désolé le% s n'était pas dans le code d'origine. c'était une faute de frappe.