Ir ao conteúdo
  • Cadastre-se

C Erro ao armazenar um char na structs de uma matriz, sendo sobreposta.


Posts recomendados

Na hora de eu printar, elas estão de alguma forma sobrepostas. Já não faço ideia do que possa ser.
O FOR tá estranho porque é necessário que TSala dados[ANDAR][SALA][TURNO] seja dessa forma e nessa ordem.

//importação de bibliotecas
#include <stdio.h>
#include <string.h>

//definição de constantes
#define ANDAR 1
#define SALA 1
#define TURNO 2

//declaração de tipos
typedef struct {
    int status, periodo; 
    char curso[50];
} TSala;

//definição dos protótipos
void leituraDados (TSala dados[ANDAR][SALA][TURNO]);

//main
void main ()
{
    //declaração de variáveis
    TSala dados[ANDAR][SALA][TURNO];

    //preenchendo o vetor
    leituraDados (dados);
    
}
//implementações das funções
void leituraDados (TSala dados[ANDAR][SALA][TURNO])
{
    //declaração de variáveis
    int i, j, h;
    
    //3 for percorrendo todos os dados da matriz
    for (i=0; i<=ANDAR; i++)
    {
        for (j=0; j<=TURNO; j++)
        {
            for (h=0; h<=SALA; h++)
            {
                printf("\nInforme o Status do Andar %d, Turno %d, Sala %d: ", i+1, j, h+1);
                scanf("%d", &dados[i][h][j].status);
                
                printf("\nSTATUS = %d\n", dados[i][h][j].status);
                
                //Caso a sala esteja com o status alocada (status=1) irá receber as informações da mesma
                if (dados[i][h][j].status == 1)
                {
                    fflush (stdin);
                    printf("\n----- Informe o Curso do Andar %d, Turno %d, Sala %d: ", i+1, j, h+1);
                    gets (dados[i][h][j].curso);
                    printf("\nCURSO = %s\n", dados[i][h][j].curso);
                    printf("\nI(ANDAR)= %d | J(TURNO)= %d | H(SALA)= %d", i, j, h);
                    
                    printf("\n----- Informe o Periodo do Andar %d, Turno %d, Sala %d: ", i+1, j, h+1);
                    scanf("%d", &dados[i][h][j].periodo);                    
                }                
            }
        }
    }
    
    for (i=0; i<=ANDAR; i++)
    {
        for (j=0; j<=TURNO; j++)
        {
            for (h=0; h<=SALA; h++)
            {
                if (dados[i][h][j].status == 1)
                {

                    printf("\nCURSO = %s\n", dados[i][h][j].curso);
                                    
                }
            }
        }
    }
}

 

  • Confuso 1
Link para o comentário
Compartilhar em outros sites

Olá @João Vitor Freitas  bom dia.

Pelos testes que eu fiz aqui na minha maquina o problema acontece na linha de número 52, quando você solicita para o usuário digitar o nome do curso que está sendo ministrado em uma determinada sala.

Na minha máquina aparece um erro para mim:

image.png.1dde7b72fc04d951d1fd2c8421746333.png

 

Pois bem!

Pelo o que eu entendi, tente trocar isso:

gets (dados[i][h][j].curso);

Por isso:

scanf("%s", dados[i][h][j].curso);

 

Depois me diz se deu certo ou não.

Link para o comentário
Compartilhar em outros sites

@thefill Essa mensagem de warning está dizendo que a função gets é perigosa e não deve ser usada. E ela é perigosa pois não limita o número de caracteres lidos e armazenados no vetor de char, o que significa que se a entrada for mais longa do que o tamanho vetor ele vai estourar o tamanho do espaço alocado, tentando guardar valores além deste espaço.

 

Mas o modo como você usou a função scanf tem exatamente o mesmo problema da função gets pois não limita o tamanho da string que pode ser lida, resultando no mesmo perigo de estourar o tamanho do vetor de char.

 

O modo correto seria assim:

scanf(" %49s", dados[i][h][j].curso);

//Ou se também quiser armazenar frases, não apenas palavras:

scanf(" %49[^\n]", dados[i][h][j].curso);

Limitando para ler no máximo 49 caracteres não nulos (e nesse caso extremo usaria a 50ª posição do vetor para armazenar o caractere nulo '\0' indicando o fim da string).

 

Ou então também pode usar a função fgets:

fgets(dados[i][h][j].curso, 50, stdin)

Pois ela exige que forneça o tamanho do vetor, e limita a leitura baseado nisto.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

image.png.a121a3a4f45135a07419deec214dbb80.png

Não escreva assim. Declare as variáveis de controle do loop DENTRO do for. Levou uma década para arrumarem isso na linguagem C. Só que foi a década de 70. É um desastre usar assim, em especial com esses nom1inhos ingênuos como i e k ficando glabais em main.

 

Você usou <= na condição de todos os for :(

 

MAs por exemplo definiu ANDAR como um, então dados é o que?

 

 dados é

 

		TSala[1][1][2]

 

e seus loops vão acessar ANDAR 0 e 1 (que não existe), TURNO 0 e 1 (que não existe) e SALA 0,1 e 2. SALA 2 não existe também...

 

Não use gets() nunca. Evite números mágicos no programa,, como status 1 para sala alocada. Use constantes ou #define

 

 

	printf("\n----- Informe o Periodo do Andar %d, Turno %d, Sala %d: ", i+1, j, h+1);
	scanf("%d", &dados[i][h][j].periodo);   

 

Isso é estranho. turno e período? Não era pra ser a mesma coisa?

 

teste o retorno de scanf() SEMPRE

 

use constantes enquanto estiver testando. É muito chato ficar digitando coisas a olho só pra testar

 

E depois use arquivos pra ler. É muito mais fácil

Link para o comentário
Compartilhar em outros sites

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!