Ir para conteúdo

Arquivado

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

captaoxdzao

Problema na criação de uma agenda em C

Recommended Posts

Boa tarde a todos.

 

Estava tentando criar um programinha que cria uma agenda, o programa funciona porém com alguns problemas:

 

PRIMEIRO: se o usuario tentar cadastrar um nome composto,ao ser listado esse nome, o programa entende o sobrenome como um nome a parte...

 

SEGUNDO: ao digitar uma opção invalida, é pedido que o usuário digite uma opção válida seguido de um bip, até aí tudo bem. Se eu entro no programa e digito uma opção errada, ele funciona perfeitamente,porém,se escolher qualquer opção do programa e voltar ao menu inicial,o programa aceita qualquer coisa que eu digitar além de repetir o ultimo comando que eu tenha executado... acredito que esteja acontecendo algo errado com o meu ''default'' dentro da função 'menu', mas não consegui resolver.... segue o código e,desde já, agradeço a atenção:

 

 

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

void cadastra(char nome[25], char telefone[12]){ 
	
	FILE *arquivo;
	
	arquivo=fopen("nomes.txt","at");
	
	if (arquivo==NULL){
		printf("Deu zica na gravacao do arquivo! :/");
	}
	
	fprintf(arquivo,"%s %s\n",nome,telefone);
	
	fclose(arquivo);
	
}



void listar(){
	
	char n[25],t[12];
	
	FILE *arquivo;
	
	arquivo=fopen("nomes.txt","rt");
	if (arquivo==NULL){
		
		printf("Zica na leitura do arquivo! :/");
	}
	
	while(!feof(arquivo)){
		
		fscanf(arquivo,"%s  %s ",&n,&t);
		
		
		
		printf("Nome: %s --- Telefone: %s\n",n,t);
		
		
	}
	
}



void menu(){
	
	char nome[25];
	char tel[12];
	int opcao;
	
	
	do{
		printf("\n\t\t\t***Bem Vindo ao programa AGENDA***\n\n\n\t\t\t\tO que deseja fazer? ");
		
		printf("\n\n1-Cadastrar nome e telefone\n\n2-Listar nome e telefone\n\n3-Sair\n\nOPCAO: ");
		scanf("%d",&opcao);
		
		setbuf(stdin,NULL);
		
		switch(opcao){
			
		case 1:
			system("cls");
			printf("Digite o nome: ");
			fgets(nome,25,stdin);
			
			setbuf(stdin,NULL);
			
			printf("\nDigite o telefone: ");
			fgets(tel,12,stdin);
			
			setbuf(stdin,NULL);
			system("cls");
			
			cadastra(nome,tel);
			
			break;
			
		case 2:
			
			system("cls");
			listar();
			getchar();
			system("cls");
			break;
			
			
			
		case 3:
			system("cls");
			printf("\n\t\t\tATE A PROXIMA!:)");
			
			break;
			
		default:
			
			printf("\n\n***Digite uma opcao valida!***\n\a");
			getchar();
			system("cls");
			menu();
		}
	}
	while(opcao!=3);
}








int main(){
	
	menu();		
}	

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.
Para Obter o nome completo utilize scanf(). Do seguinte modo:

scanf(" %[^\n]",nome);

Desta forma ele obtém a string até achar um '\n' (quebra de linha ou "Enter"). Para obter o nome pelo arquivo é da mesma forma, mas na hora de escreve-lo no arquivo você terá que colocar o nome em uma linha e o telefone em outra, pois como eu falei, desta forma irá ler até encontrar um '\n'.

Eu não consegui entroncar o segundo erro, mas tente tirar a chamada à função menu() do default, pois saindo de lá, ele retornará para o começo do loop automaticamente. E lhe aconselho a ler o tópico fixo sobre o uso da função system().

 

Espero ter ajudado, pelo menos um pouco xD.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Po irmão, o “menu” no default de fato era irrelevante, mas corrigi-lo não solucionou nada. Também tentei escrever o scanf da forma que me disse mas também não fez diferença no programa da agenda ( eu tinha feito um outro programa só pra testar esse %[^\n] e deu certo nele...).

 

E outra coisa esquisita que reparei: na verdade, nunca dá erro, independente de ser a primeira vez que executo a agenda ou não, caso a PRIMEIRA opção invalida digitada pelo usuário seja um NUMERO, de modo que a mensagem de alerta e o bip funcionam perfeitamente. Porém, se o usuário, a partir da segunda vez que for escolher uma opção, digitar qualquer coisa que não seja um número, a mensagem de erro não funciona e aparece a última tela executada pelo usuário.

 

Moral da historia: Só funciona o alerta de erro para números e não para qualquer tecla. Eu sei que minha variável ‘’opcao’’ é do tipo int, mas ainda assim, em outros programas, independente de ser int ou não, o C entendia que era erro mesmo se o que o usuário digitasse não fosse um número (até porque esse é a condição do meu default)... muito estranho cara, to quebrando a cabeça aqui! Tentei ser o mais claro possível, mas acho que fica mais fácil de entender testando meu programa, você poderia dar uma conferida pra ver se isso tá acontecendo contigo também? Eu uso Windows e o compilador zinjaI. Valeu pela atenção!

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.