1
votes

Impression d'un tableau int composé de chiffres et de lettres

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.

  1. Je sais que les caractères et les nombres sont présents dans le tableau, mais seuls les nombres s'impriment.
  2. les lignes peuvent-elles
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 commentaires

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


3 Réponses :


4
votes

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


1 commentaires

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.



1
votes

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


1 commentaires

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?



1
votes

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.


0 commentaires