Ir ao conteúdo

C Diferenciar int de char no printf


Ir à solução Resolvido por isrnick,

Posts recomendados

Postado

Olá, estou desenvolvendo um programa que foi necessário criar uma matriz e atribuir elementos a ela, sendo alguns letras (Que estão contidas em variáveis tipo char) e outros, números (Os quais estão contidos em variáveis do tipo int), (Ex: M[0][0]='A', M[0][1]=7, M[1][0]=9, M[1][1]='Z'...). No entanto, estou tendo dificuldades na hora de imprimir a matriz, já que se eu usar %d no printf irá imprimir os números (variaveis int), dando erro nas letras, e %c irá fazer o contrário. Gostaria de saber como eu posso fazer (Talvez utilizando um if para diferenciar ambas as condições) para que eu possa imprimir todos os elementos sem erro. Obrigado

  • Curtir 1
Postado

Os números sempre tem só 1 dígito? Se sim, então pode converter para o respectivo caractere na hora de imprimir, por exemplo transformar um 7 em um '7' e sempre imprimir como caractere.

 

Pra fazer essa conversão basta somar o dígito ao caractere '0'.

 

printf("%c", M[i][j] < 10 ? M[i][j] + '0' : M[i][j]);

 

Aí tem que se perguntar se existe a necessidade dos dígitos estarem na matriz na forma numérica, pois poderiam já estar como o caractere e não precisaria fazer essa conversão para imprimir.

  • Curtir 1
  • Obrigado 1
  • Solução
Postado

Então a solução que postei não funciona pois os números podem ter mais de 1 dígito.

 

Mas você tem um problema maior, não há como diferenciar pois caracteres são números, ou seja o caractere 'A' na verdade é o número 65 (consulte a tabela ASCII para ver números correspondentes de cada caractere).

 

Seria necessário usar uma struct com uma flag para indicar se é para tratar como int ou char...

#include <stdio.h>

typedef struct intorchar{
  int i;
  char ischar;
} intc;

int main()
{
    intc M[20][20];
    
    M[0][0].i = 'A';
    M[0][0].ischar = 1;
    
    M[0][1] = (intc){'B', 1};
    
    M[0][2].i = 10;
    M[0][2].ischar = 0;
    
    M[0][3] = (intc){20, 0};
    
    M[0][0].ischar ? printf("%c\n", M[0][0].i) : printf("%d\n", M[0][0].i);
    M[0][1].ischar ? printf("%c\n", M[0][1].i) : printf("%d\n", M[0][1].i);
    M[0][2].ischar ? printf("%c\n", M[0][2].i) : printf("%d\n", M[0][2].i);
    M[0][3].ischar ? printf("%c\n", M[0][3].i) : printf("%d\n", M[0][3].i);

    return 0;
}

 

  • Curtir 1
Postado
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

typedef struct
{
    union
    {
        int int_value;
        char char_value;
    };
    bool is_int;
} int_or_char;

void make_int(int v, int_or_char* result)
{
    result->is_int = true;
    result->char_value = 0;
    result->int_value = v;
}

void make_char(char v, int_or_char* result)
{
    result->is_int = false;
    result->int_value = 0;
    result->char_value = v;
}


int main()
{
    int_or_char matrix[2][2];

    make_int(10, &matrix[0][0]);
    make_char('c', &matrix[0][1]);

    make_int(20, &matrix[1][0]);
    make_char('d', &matrix[1][1]);

    for (size_t x = 0; x < 2; x++)
    {
        for (size_t y = 0; y < 2; y++)
        {
            int_or_char* p = &matrix[x][y];
            if (p->is_int)
                printf("matrix[%zu][%zu] = %d\n", x, y, p->int_value);
            else
                printf("matrix[%zu][%zu] = %c\n", x, y, p->char_value);
        }
    }

    return 0;
}

Veja se isso ajuda

  • Obrigado 2
Postado

@Matheus Maldi Como só vai guardar int ou char e nunca os dois ao mesmo tempo na struct pode usar uma união.

typedef struct
{
    union{
        int int_value;
        char char_value;
    };
    bool is_int;
} int_or_char;

Para que int_value e char_value usem o mesmo local da memória.

  • Curtir 2
Postado
agora, isrnick disse:

@Matheus Maldi Como só vai guardar int ou char e nunca os dois ao mesmo tempo na struct pode usar uma união.


typedef struct
{
    union{
        int int_value;
        char char_value;
    };
    bool is_int;
} int_or_char;

Para que int_value e char_value usem o mesmo local da memória.

 

Havia a pouco tempo editado para fazer isso

  • Curtir 1
  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...