Ir ao conteúdo
  • Cadastre-se
Lucas Zottis

C Condição para saída de loop

Posts recomendados

Opa, eu sou meio novato em programação, mas meu problema é o seguinte.

Eu coloquei uma condição para sair dos loops, onde eu tenho que inserir o "s" para sair, mas o problema é que mesmo eu tendo criado diferentes variáveis, uma para cada loop,

ele sai dos loops como se fosse uma variável só, assim, ou saindo do loop principal, ou fica em loop infinito no case 3.

Não sei se ficou bem claro, mas é isso.

Se alguém puder ajudar, só agradeço.

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

struct cad_livro{
	int cod;
	char tit [41];
	char autor [41];
	char area [41];
	char ano [5]; 
	char edit[41];
};

int main(){
	setlocale(LC_ALL,"");
	// Vetor de registros
	struct cad_livro livro [20];
	// Registro auxiliar para ordenação
	struct cad_livro aux;
	// "i1" = Índice 1; "i2" = Índice2; "op" = Opção; "cont" = Contagem de códigos; "n" = Número de busca de código; "busca" = Retorno de busca de código;
	int i1,i2,op,cont,n,busca;
	// "sair" = Sair dos loops menores; "sair_prog" = Sair do loop principal;
	char sair_cad,sair_pes,sair_ord,sair_prog;
	cont = 0;
	do{
		
		printf("\n               =============== Menu ===============               \n");
		printf("\n1 - Cadastrar livro");
		printf("\n2 - Imprimir informações do livro");
		printf("\n3 - Pesquisar livros por código");
		printf("\n4 - Ordenar livros por ano");
		printf("\n5 - Sair do programa\n\n\n");
		printf("\nOpção: ");
		scanf("%d",&op);
		system("CLS");
		fflush(stdin);
		switch (op){
			case 1:{
				do{
					printf("\n               =============== Cadastrar ===============               \n\n");
					livro[cont].cod = cont;
					printf("Título: ");
					gets(livro[cont].tit);
					printf("Autor: ");
					gets(livro[cont].autor);
					printf("Área: ");
					gets(livro[cont].area);
					printf("Ano: ");
					gets(livro[cont].ano);
					printf("Editora: ");
					gets(livro[cont].edit);
					cont++;
					system("CLS");
					printf("\n               =============== Cadastrar ===============               \n\n");
					printf("Voltar para o menu [s/n]? ");
					scanf("%c",&sair_cad);
					system("CLS");
					fflush(stdin);
				}while(sair_cad != 's');
				break;
			}
			case 2:{
				printf("\n               =============== Imprimir ===============               \n");
				for(i1 = 0; i1 < 20; i1++){
					printf("\nCódigo: %d",livro[i1].cod);
					printf("\nTítulo: %s",livro[i1].tit);
					printf("\nAutor: %s",livro[i1].autor);
					printf("\nÁrea: %s",livro[i1].area);
					printf("\nAno: %s",livro[i1].ano);
					printf("\nEditora: %s",livro[i1].edit);
					printf("\n     -------------     \n");
				}
				break;
			}
			case 3:{
				do{
					printf("\n               =============== Pesquisar ===============               \n");
					busca = 0;
					printf("\nBuscar o código: ");
					scanf("%d",&n);
					for(i1 = 0; i1 < 20; i1++){
						if(n == livro[i1].cod){
							busca = 1;
						}
					}
						if(busca == 1){
							printf("\n\nCódigo: %d",livro[n].cod);
							printf("\nTítulo: %s",livro[n].tit);
							printf("\nAutor: %s",livro[n].autor);
							printf("\nÁrea: %s",livro[n].area);
							printf("\nAno: %s",livro[n].ano);
							printf("\nEditora: %s",livro[n].edit);
						}
					else{
						printf("Livro não cadastrado");
					}
					printf("Fazer nova pesquisa [s/n]? ");
					scanf("%c",&sair_pes);
				}while(sair_pes != 's');
				break;
			}
			case 4:{
				printf("\n               =============== Ordernar ===============               \n");
				for(i1 = 0; i1 > 20; i1++){
					for(i2 = i1+1; i1 > 20; i2++){
						if(livro[i1].ano > livro[i2].ano){
							aux = livro[i1];
							livro[i1] = livro[i2];
							livro[i2] = aux;
						}
					}
				}
				break;
			}
			case 5:{
				printf("Deseja sair[s/n]? ");
				scanf("%c",&sair_prog);
				system("CLS");
				if(sair_prog == 's'){
					printf("Saindo... Tchau!!");
				}
				break;
			}
		}
	}while (sair_prog != 's');
	return(0);
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Teste colocar um espaço antes do %c nas strings dos scanfs para descartar os caracteres brancos que vierem antes da letra digitada.

 

Ex:

scanf(" %c",&sair_pes);

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Lucas Zottis dei uma arrumada, olha os comentários

/* Aprenda a usar comentarios de bloco */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>     /* Tenha em mente que isso e uma biblioteca do C++ */
#include <locale.h>     /* utilidade zero no windows */

struct cad_livro{
	int cod;
	char tit [41];
	char autor [41];
	char area [41];
	char ano [5]; 
	char edit[41];
};

int main(){
	setlocale(LC_ALL,"");
	// Vetor de registros
	struct cad_livro livro [20];
	// Registro auxiliar para ordenação
	struct cad_livro aux;
	// "i1" = Índice 1; "i2" = Índice2; "op" = Opção; "cont" = Contagem de códigos; "n" = Número de busca de código; "busca" = Retorno de busca de código;
	int i1,i2,op,cont,n,busca;
	// "sair" = Sair dos loops menores; "sair_prog" = Sair do loop principal;
	char sair_cad,sair_pes,sair_ord,sair_prog;      
	cont = 0;
	do{
		
		printf("\n               =============== Menu ===============               \n");
		printf("\n1 - Cadastrar livro");
		printf("\n2 - Imprimir informações do livro");
		printf("\n3 - Pesquisar livros por código");
		printf("\n4 - Ordenar livros por ano");
		printf("\n5 - Sair do programa\n\n\n");
		printf("\nOpção: ");
		scanf("%d",&op);
		getchar();      /* Coloquer sempre um getchar depois de cada scanf, isso evita do codigo ficar\
		                  pulando por causa do new line */
		/*system("CLS");      Sem efeito em outros sistemas, Só em windows. */
		/*fflush(stdin);      Isso vai deixar o seu codigo maluco.*/
		switch (op){
			case 1:{
				do{
					printf("\n               =============== Cadastrar ===============               \n\n");
					livro[cont].cod = cont;
					printf("Título: ");
					scanf("%s",livro[cont].tit);
					getchar();
					/*gets(livro[cont].tit);   gets não é mais usado. */
					printf("Autor: ");
					scanf("%s",livro[cont].autor);
					getchar();
					/*gets(livro[cont].autor);*/
					printf("Área: ");
					scanf("%s",livro[cont].area);
					getchar();
					/*gets(livro[cont].area);*/
					printf("Ano: ");
					scanf("%s",livro[cont].ano);
					getchar();
					/*gets(livro[cont].ano);*/
					printf("Editora: ");
					scanf("%s",livro[cont].edit);
					getchar();
					/*gets(livro[cont].edit);*/
					cont++;
					/*system("CLS");*/
					printf("\n               =============== Cadastrar ===============               \n\n");
					printf("Voltar para o menu [s/n]? ");
					scanf("%c",&sair_cad);
					getchar();
					/*system("CLS");*/
					/*fflush(stdin);*/
				}while(sair_cad != 's');
				break;
			}
			case 2:{
				printf("\n               =============== Imprimir ===============               \n");
				for(i1 = 0; i1 < 20; i1++){
					printf("\nCódigo: %d",livro[i1].cod);
					printf("\nTítulo: %s",livro[i1].tit);
					printf("\nAutor: %s",livro[i1].autor);
					printf("\nÁrea: %s",livro[i1].area);
					printf("\nAno: %s",livro[i1].ano);
					printf("\nEditora: %s",livro[i1].edit);
					printf("\n     -------------     \n");
				}
				break;
			}
			case 3:{
				do{
					printf("\n               =============== Pesquisar ===============               \n");
					busca = 0;
					printf("\nBuscar o código: ");
					scanf("%d",&n);
					for(i1 = 0; i1 < 20; i1++){
						if(n == livro[i1].cod){
							busca = 1;
						}
					}
						if(busca == 1){
							printf("\n\nCódigo: %d",livro[n].cod);
							printf("\nTítulo: %s",livro[n].tit);
							printf("\nAutor: %s",livro[n].autor);
							printf("\nÁrea: %s",livro[n].area);
							printf("\nAno: %s",livro[n].ano);
							printf("\nEditora: %s",livro[n].edit);
						}
					else{
						printf("Livro não cadastrado");
					}
					printf("Fazer nova pesquisa [s/n]? ");
					scanf("%c",&sair_pes);
				}while(sair_pes != 's');
				break;
			}
			case 4:{
				printf("\n               =============== Ordernar ===============               \n");
				for(i1 = 0; i1 > 20; i1++){
					for(i2 = i1+1; i1 > 20; i2++){
						if(livro[i1].ano > livro[i2].ano){
							aux = livro[i1];
							livro[i1] = livro[i2];
							livro[i2] = aux;
						}
					}
				}
				break;
			}
			case 5:{
				printf("Deseja sair[s/n]? ");
				scanf("%c",&sair_prog);
				getchar();
				/*system("CLS");*/
				if(sair_prog == 's'){
					printf("Saindo... Tchau!!");
				}
				break;
			}
		}
	}while (sair_prog != 's');
	return(0);
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use:

scanf(" %40[^\n]", livro[cont].tit);

 

No lugar de:

gets(livro[cont].tit);

 

scanf com %s não vai ser suficiente pra substituir o gets, pois só vai capturar a primeira palavra ao invés da frase inteira, para isso deve do especificador %[ como mostrei, capturando qualquer caractere exceto o caractere nova linha '\n'.

 

Também precisa limitar o número de caracteres, nesse caso captura até 40 caracteres, do contrário cai no mesmo problema de usar gets que poderia causar estouro do tamanho máximo que o vetor de caracteres pode armazenar.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY Eu tentei rodar o código aqui, mas ainda continua em loop infinito no case 3 depois de cadastrar algum dado e ainda apareceu mais um bug no case1, não estou conseguindo cadastrar o autor, o cursor pula direto para cadastrar a area.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Lucas Zottis Foi por que faltou getchar na linha 96 e na linha 114 agora está funcionando.

Uma dica de iniciante e faça algo menor, quebre o problema em varias partes menores que você de conta de resolver.

/* Aprenda a usar comentarios de bloco */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>     /* Tenha em mente que isso e uma biblioteca do C++ */
#include <locale.h>     /* utilidade zero no windows */

struct cad_livro{
	int cod;
	char tit [41];
	char autor [41];
	char area [41];
	char ano [5]; 
	char edit[41];
};

int main(){
	setlocale(LC_ALL,"");
	// Vetor de registros
	struct cad_livro livro [20];
	// Registro auxiliar para ordenação
	struct cad_livro aux;
	// "i1" = Índice 1; "i2" = Índice2; "op" = Opção; "cont" = Contagem de códigos; "n" = Número de busca de código; "busca" = Retorno de busca de código;
	int i1,i2,op,cont,n,busca;
	// "sair" = Sair dos loops menores; "sair_prog" = Sair do loop principal;
	char sair_cad,sair_pes,sair_ord,sair_prog;      
	cont = 0;
	do{
		
		printf("\n               =============== Menu ===============               \n");
		printf("\n1 - Cadastrar livro");
		printf("\n2 - Imprimir informações do livro");
		printf("\n3 - Pesquisar livros por código");
		printf("\n4 - Ordenar livros por ano");
		printf("\n5 - Sair do programa\n\n\n");
		printf("\nOpção: ");
		scanf("%d",&op);
		getchar();      /* Coloquer sempre um getchar depois de cada scanf, isso evita do codigo ficar\
		                  pulando por causa do new line */
		/*system("CLS");      Sem efeito em outros sistemas, Só em windows. */
		/*fflush(stdin);      Isso vai deixar o seu codigo maluco.*/
		switch (op){
			case 1:{
				do{
					printf("\n               =============== Cadastrar ===============               \n\n");
					livro[cont].cod = cont;
					printf("Título: ");
					scanf("%s",livro[cont].tit);
					getchar();
					/*gets(livro[cont].tit);   gets não é mais usado. */
					printf("Autor: ");
					scanf("%s",livro[cont].autor);
					getchar();
					/*gets(livro[cont].autor);*/
					printf("Área: ");
					scanf("%s",livro[cont].area);
					getchar();
					/*gets(livro[cont].area);*/
					printf("Ano: ");
					scanf("%s",livro[cont].ano);
					getchar();
					/*gets(livro[cont].ano);*/
					printf("Editora: ");
					scanf("%s",livro[cont].edit);
					getchar();
					/*gets(livro[cont].edit);*/
					cont++;
					/*system("CLS");*/
					printf("\n               =============== Cadastrar ===============               \n\n");
					printf("Voltar para o menu [s/n]? ");
					scanf("%c",&sair_cad);
					getchar();
					/*system("CLS");*/
					/*fflush(stdin);*/
				}while(sair_cad != 's');
				break;
			}
			case 2:{
				printf("\n               =============== Imprimir ===============               \n");
				for(i1 = 0; i1 < 20; i1++){
					printf("\nCódigo: %d",livro[i1].cod);
					printf("\nTítulo: %s",livro[i1].tit);
					printf("\nAutor: %s",livro[i1].autor);
					printf("\nÁrea: %s",livro[i1].area);
					printf("\nAno: %s",livro[i1].ano);
					printf("\nEditora: %s",livro[i1].edit);
					printf("\n     -------------     \n");
				}
				break;
			}
			case 3:{
				do{
					printf("\n               =============== Pesquisar ===============               \n");
					busca = 0;
					printf("\nBuscar o código: ");
					scanf("%d",&n);
					getchar();
					for(i1 = 0; i1 < 20; i1++){
						if(n == livro[i1].cod){
							busca = 1;
						}
					}
						if(busca == 1){
							printf("\n\nCódigo: %d",livro[n].cod);
							printf("\nTítulo: %s",livro[n].tit);
							printf("\nAutor: %s",livro[n].autor);
							printf("\nÁrea: %s",livro[n].area);
							printf("\nAno: %s",livro[n].ano);
							printf("\nEditora: %s",livro[n].edit);
						}
					else{
						printf("Livro não cadastrado");
					}
					printf("Fazer nova pesquisa [s/n]? ");
					scanf("%c",&sair_pes);
					getchar();
				}while(sair_pes != 's');
				break;
			}
			case 4:{
				printf("\n               =============== Ordernar ===============               \n");
				for(i1 = 0; i1 > 20; i1++){
					for(i2 = i1+1; i1 > 20; i2++){
						if(livro[i1].ano > livro[i2].ano){
							aux = livro[i1];
							livro[i1] = livro[i2];
							livro[i2] = aux;
						}
					}
				}
				break;
			}
			case 5:{
				printf("Deseja sair[s/n]? ");
				scanf("%c",&sair_prog);
				getchar();
				/*system("CLS");*/
				if(sair_prog == 's'){
					printf("Saindo... Tchau!!");
				}
				break;
			}
		}
	}while (sair_prog != 's');
	return(0);
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!