Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Cornelius

Estouro de buffer

Recommended Posts

Olá a todos. estou com um problema num programinha que estou fazendo. Rodando o menu, na parte: Incluir > dados pessoais, o fgets não está funcionando. Testei a função sozinha e deu certo. Segue o código:

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct aluno
{
	   char nome[15];
	   char codigo[4];
	   int nota[3];
};
struct aluno cadastro;

int menu() //menu do programa
{
	int esc;
	
	printf("\2 PROGRAMA DE CADASTRO DE ALUNOS \2\n");
	printf("Digite a opção que deseja:\n1.Incluir\n2.calcular nota\n3.Limpar a tela\n4.sair\n");
	scanf("%d",&esc);
	
	switch(esc)
	{
			   case 1:
					incluir();
					menu();
			   case 2:
					//mostrar();
					//menu();
			   case 3:
					system("cls");
					menu();
			   case 4:
					exit(0);
					break;
			   default:
					printf("Opcao invalida\n");				
	}
}
/////////////////////////// 

int incluir() //
{
	int esc;
	
	printf("Digte o que deseja cadastrar\n1.dados pessoais\n2.Notas\n3.Voltar\n");
	scanf("%d",&esc);
	switch(esc)
	{
		 case 1:
			  incluir_nome();
			  system("cls");
			  incluir();
		 case 2: 
			  incluir_nota();
			  system("cls");
			  menu();
		 case 3:
			  system("cls");
			  menu();
		 case 4:
			  calc();
		 default:
			  printf("opcao invalida\n");
	}
}

int incluir_nome()
{
	printf("Digite o nome\n");
	fgets(cadastro.nome,15,stdin);
}

int incluir_nota()
{
   int i; 
   char cnome[15];
   
   printf("Digite seu nome\n");
   fgets(cnome,14,stdin);
   
   if(strcmp(cnome,cadastro.nome))
   {
	   for(i=1;i<4;i++)
	   {
	   printf("Digite a %d nota\n",i);
	   scanf("%d",&cadastro.nota[i]);
	   }

   }
   else
   {
	   printf("Nome nao cadastrado.\n");
	   incluir();
	   
   }
}

int calc() //Função para calcular
{
	int i,media=0;
	for(i=1;i<4;i++)
	{
	   media+=cadastro.nota[i];
	}
	media=media/3;
	media=calc();
	printf("%s, sua media foi %d",cadastro.nome,media);
	printf("\n\n");
}

int main()
{
	menu();
	
	system("pause");
}

Obrigado http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

É o bendito buffer de entradas.

 

Para corrigir voce pode fazer isso:

 

int incluir() //

{

int esc;

 

printf("Digte o que deseja cadastrar\n1.dados pessoais\n2.Notas\n3.Voltar\n");

scanf("%d",&esc);

getchar();

Nesse caso o getchar retira o \n do buffer.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso não é estouro de buffer.

Voce está pedindo para o scanf ler um número inteiro e é isso que ele faz.

O \n não faz parte do que voce pediu pra ler, então o \n fica no buffer.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Tendi, funcionou, brigado Kandrade, agora só mais uma dúvida: O estouro de buffer aconteceu aqui?

scanf("%d",&esc);
Li que quando apertado "enter" depois da escolha ex: 1 e "enter", é lido 1\n, é isso mesmo?

 

Abraços http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.