Ir ao conteúdo

Posts recomendados

Postado

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
Postado

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.

Postado

@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
Postado

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

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!