Ir ao conteúdo
  • Cadastre-se

C Função scanf entrando em loop e erro em leitura de string


Posts recomendados

Galera, estou com um problema que quando vou ler um valor na opção 1 na função main, ele entra em loop e fica lendo vários valores que eu digito, ao invés de continuar o código normalmente, alguém sabe dizer o que pode ser?

Nesse mesmo código, também estou tendo um problema ao ler a string na função novofunc, sempre dá o erro segmentation fault (core dumped).

Podem haver outros erros no código mas é porque ainda não revisei ele completamente, queria saber como resolver esses primeiro. Desde já agradeço.

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

typedef struct Funcionario{
	char nome[50];
	int idfunc;
	struct Funcionario *prox;
} func;

typedef struct Carro{
	int idcarro;
	struct Carro *prox;
} carro;

carro *head;
func *prim;

//criar pilha de carros
void criapilha(){
	head = malloc(sizeof(carro));
	head->prox = NULL;
}

//criar lista de funcionários
void crialista(){
	prim = malloc(sizeof(func));
	prim->prox = NULL;
}

//conta quantos funcionários estão cadastrados
int contafunc(){
	func *aux;
	int cont = 0;
	for(aux = prim; aux != NULL; aux++)
		cont++;
	return cont;
}

//conta quantos carros estão cadastrados
int contacarros(){
	carro *aux;
	int cont = 0;
	for (aux = head; aux != NULL; aux++)
		cont++;
	return cont;
}

//compara id dos funcionários
int comparafunc(int id){
	int i, num;
	func *p;
	p = prim;
	num = contafunc();
	for(i = 0; i < num; i++){
		if (id == p->idfunc)
			return 1;
		p = p->prox;
	}
	return 0;
}

//insere funcionário
void novofunc(){
	func *novo;
	novo = malloc(sizeof(func));
	char nome[50];
	int idf;
	int c = comparafunc(idf);
	printf("Digite o nome do funcionário\n");
	fgets(nome, 50, stdin);
	printf("Digite o id do funcionário\n");
	scanf("%d", &idf);
	if (c == 1)
		printf("Funcionário já cadastrado!\n");
	else{
		novo->idfunc = idf;
		novo->prox = prim->prox;
		prim->prox = novo;
	}
}

//remove funcionario
void removefunc(){
	func *p;
	p = prim->prox;
	prim->prox = p->prox;
	free(p);
}

//compara id dos carros
int compara(int id){
	int i, num;
	carro *p;
	p = head;
	num = contacarros();
	for(i = 0; i < num; i++){
		if (id == p->idcarro)
			return 1;
		p=p->prox;
	}
	return 0;
}

//insere carro
void push(int idc){
	carro *novo;
	novo = malloc(sizeof(carro));
	novo->idcarro = idc;
	novo->prox = head->prox;
	head->prox = novo;
}

//exibir carros estacionados
void exibecarros(){
	carro *p = head;
	if (p->prox == NULL)
		printf("Estacionamento vazio\n");
	else{
		printf("Os carros estacionados são:\n");
		while(p){
			printf("\nCarro %d", p->idcarro);
			p = p->prox;
		}
	}
}

//Exibe funcionários
void exibefunc(){
	func *p = prim;
	if (p->prox == NULL)
		printf("Nenhum funcionário cadastrado\n");
	else
		while(p){
			printf("\nNome: %s\nId: %d\n", p->nome, p->idfunc);
			p = p->prox;
		}
}

//remove carro
int pop(int id){
	int i, num, a;
	num = contacarros();
	carro *p;
	int c = compara(id);
	for(i = 0; i < num; i++){
		if (c == 1){
			p = head->prox;
			a = p->idcarro;
			head->prox = p->prox;
			free(p);
			return a;
		}
	}
	return 0;
}

int main(){
	int opcao, idc;
	criapilha();
	printf("Entre com a opção desejada:\n");
	printf("1. Adicionar carro\n");
	printf("2. Retirar carro\n");
	printf("3. Mostrar carros estacionados\n");
	printf("4. Cadastrar funcionário\n");
	printf("5. Remover funcionário\n");
	printf("6. Mostrar funcionários\n");
	scanf("%d", &opcao);

	switch(opcao){
		case 1:
			printf("Qual o id do carro que deseja estacionar?\n");
			scanf("%d", &idc);
			if (compara(idc) == 1)
				printf("ID já existe!");
			else{
				push(idc);
				printf("Carro estacionado!\n");
			}
			printf("Total de carros: ");
			contacarros();
		break;
		case 2:
			printf("Qual o id do carro que deseja retirar?\n");
			scanf("%d", &idc);
			pop(idc);
		break;
		case 3:
			exibecarros();
			printf("\n");
		break;
		case 4:
			novofunc();
			break;
		case 5:
			removefunc();
		break;
		case 6:
			exibefunc();
		break;
		default:
			printf("Opção inválida!");
	}
	return 0;
}

 

Link para o comentário
Compartilhar em outros sites

@Junior Conceição Encontrei os erros que você se deparou: muitas funções dentro do laço for você está fazendo aux++, mas acho que queria fazer aux = aux->prox; outro problema é que você esqueceu de chamar a função crialista no main; e o outro problema seria algo assim:

void novofunc()
{
    func *novo;
    novo = (func*)malloc(sizeof(func));
    char nome[50];
    int idf;
    int c;
    printf("Digite o nome do funcionário\n");
    fflush(stdin);
    fgets(nome, 50, stdin);
    printf("Digite o id do funcionário\n");
    scanf("%d", &idf);
    c = comparafunc(idf);
    if (c == 1)
        printf("Funcionário já cadastrado!\n");
    else
    {
        novo->idfunc = idf;
        novo->prox = prim->prox;
        prim->prox = novo;
    }
}

É compilável, mas eu não testei muito para saber se está certo e/ou faz o que você quer (meu compilador pede a conversão no malloc, mas é só tirar aí).

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

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!