Ir ao conteúdo
  • Cadastre-se
alecounter

C Problema ao criar uma matriz do tipo char

Recommended Posts

Oi pessoal, tudo bem?

 

estou aprendendo C e estou com dificuldades na parte de matriz. Por exemplo, quando faço o seguinte código

void main() {
    char matriz[3][3] = {{'a','b','c'},{'d','e','f'},{'g','h','i'}};
    printf("%c", matriz[1][1]);
}

não há impressão alguma na tela, agora se faço

void main() {
    int matriz[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    printf("%d", matriz[1][1]);
}

a saída é 5. Por qual motivo está acontecendo isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia @alecounter

 

Quando você faz um array de char como você demonstrou no exemplo, no ultimo espaço você tem que ter o '\0' que mostra que a string(array de char) chegou ao final.

 

Exemplo:

 char matriz[3][3] = {{'a','b','\0'},{'d','e','\0'},{'g','h','\0'}};

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@alecounter  No compilador online esse código imprimiu a letra 'e' como é esperado.

 

#include <stdio.h>

int main()
{
    char matriz[3][3] = {{'a','b','c'},{'d','e','f'},{'g','h','i'}};
    
    printf("%c", matriz[1][1]);

    return 0;
}

 

@Leonardo0308 Ele não está formando strings, apenas uma matriz de caracteres, logo não precisa do '\0'.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
6 minutos atrás, isrnick disse:

@alecounter  No compilador online esse código imprimiu a letra 'e' como é esperado.

 


#include <stdio.h>

int main()
{
    char matriz[3][3] = {{'a','b','c'},{'d','e','f'},{'g','h','i'}};
    
    printf("%c", matriz[1][1]);

    return 0;
}

 

@Leonardo0308 Ele não está formando strings, apenas uma matriz de caracteres, logo não precisa do '\0'.

Será que é um problema do compilador então? Estou usando o lcc

Compartilhar este post


Link para o post
Compartilhar em outros sites
11 minutos atrás, alecounter disse:

Será que é um problema do compilador então? Estou usando o lcc

 

Se não imprime 'e' imagino que seja. De acordo com o Wikipedia o lcc só conforma com o padrão C89 da linguagem C, então não é um compilador muito atualizado:

https://en.wikipedia.org/wiki/List_of_compilers#C_compilers

 

O GCC (= MinGW ou TDM-GCC no windows), e o Clang são boas opções.

adicionado 8 minutos depois
19 minutos atrás, Leonardo0308 disse:

Serio? legal tinha aprendido que precisava. kkkk sempre bom aprender algo novo, valeu @isrnick

 

O caractere '\0' é usado para indicar o fim de uma string em um vetor de caracteres, ou seja indica onde a sequência de caracteres que formam a string no vetor de caracteres acaba, assim funções que trabalham com strings conseguem saber em que ponto parar.

 

Mas vetores de caracteres podem ser usados para outros propósitos além de armazenamento de strings, então nem sempre colocar um '\0' no fim é algo necessário.

  • Curtir 5

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, o problema foi resolvido trocando o compilador, agora estou usando o Dev-C++

obrigado a todos!

Compartilhar este post


Link para o post
Compartilhar em outros sites
13 minutos atrás, alecounter disse:

Pessoal, o problema foi resolvido trocando o compilador, agora estou usando o Dev-C++

obrigado a todos!

 

Eu recomendaria o Codeblocks ao invés do Dev-C++, ambos podem ser obtidos com o TDM-GCC (Mingw) já incluso, mas o Codeblocks tem uma versão mais atualizada do TDM-GCC, além do Codeblocks ser atualizado bem mais frequentemente que o Dev-C++, e ser usado por um número maior de pessoas logo tem uma quantidade maior de recursos de extensão disponíveis.

 

http://www.codeblocks.org/downloads/26

Compartilhar este post


Link para o post
Compartilhar em outros sites
38 minutos atrás, isrnick disse:

 

Eu recomendaria o Codeblocks ao invés do Dev-C++, ambos podem ser obtidos com o TDM-GCC (Mingw) já incluso, mas o Codeblocks tem uma versão mais atualizada do TDM-GCC, além do Codeblocks ser atualizado bem mais frequentemente que o Dev-C++, e ser usado por um número maior de pessoas logo tem uma quantidade maior de recursos de extensão disponíveis.

 

http://www.codeblocks.org/downloads/26

obrigado pela sugestão, vou fazer o download e testar, eu não gostei do Dev-C++ porque ele ficou encrencando com uns comandos aqui por exemplo:

for(int i = 1; i < n; i++) ele reclama que tá declarando dentro do for, e o lcc não dava esse pau.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Apenas por questões didáticas: se usar literais strings ele atende todas as necessidades básicas.

12 horas atrás, alecounter disse:

Por exemplo, quando faço o seguinte código


void main() {
    char matriz[3][3] = {{'a','b','c'},{'d','e','f'},{'g','h','i'}};
    printf("%c", matriz[1][1]);
}

Mais está certo, não deve funcionar mesmo, a implementação para esse tipo de inicialização de caracteres veio em atualizações posteriores a ANSI C.

 

Então para essa situação você tem 3 opções

1- fazer quase o que @Leonardo0308 mais não exatamente,

dois- ou usar tipos inteiros na inicialização, e

3- inicializar uma por um do valores, porém todos não na declaração, e sim por atribuição.

 

Código C

/* ANSI C - Style -- Inicialização de Caracteres Array */

#include <stdio.h>
/** funcao principal do programa  */
int main (void){
    char matriz1[3][4] = {
            "abc",
            "def",
            "igh",
    };
    int  matriz2[3][3] = {
            {'a', 'b', 'c'},
            {'d', 'e', 'f'},
            {'g', 'h', 'i'},
    };
    char matriz3[3][3];
        matriz3[0][0] = 'a';
        matriz3[0][1] = 'b';
        matriz3[0][2] = 'c';
        matriz3[1][0] = 'd';
        matriz3[1][1] = 'e';
        matriz3[1][2] = 'f';
        matriz3[2][0] = 'g';
        matriz3[2][1] = 'h';
        matriz3[2][2] = 'i';
    
        printf ("%c\n", matriz1[1][1]);  /* ~Imprimir o caractere: e */
        printf ("%c\n", matriz2[1][1]);  /* ~Imprimir o caractere: e */
        printf ("%c\n", matriz3[1][1]);  /* ~Imprimir o caractere: e */
     return 0;
}

Vai funcionar !!!

 

12 horas atrás, isrnick disse:

Mas vetores de caracteres podem ser usados para outros propósitos além de armazenamento de strings, então nem sempre colocar um '\0' no fim é algo necessário.

Concordo! Porém o desnecessário não é exatamente ruim.

 

12 horas atrás, isrnick disse:

Se não imprime 'e' imagino que seja. De acordo com o Wikipedia o lcc só conforma com o padrão C89 da linguagem C, então não é um compilador muito atualizado:

Concordo! Principalmente porque são poucos os livros para essa versão em contrapartida são muitos para C'11

 

 

Dúvidas, críticas ou sugestões?

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@alecounter A questão do erro no for provavelmente é apenas uma questão de configuração, o compilador deve estar configurado para usar o padrão C89, mas essa possibilidade de declarar no for foi introduzida no padrão C99 da linguagem.

 

Sobre o Codeblocks só certifique-se de pegar uma das versões com o TDM-GCC já incluso, ou seja deve ter MinGW no nome do arquivo, por exemplo "codeblocks-17.12mingw-setup.exe".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×