Ir ao conteúdo
  • Cadastre-se

C programa em C trava/não continua executando.


nonick12

Posts recomendados

Esse é o pedaço do código de um programa em C sobre escolher seu lanche no cardápio e fazer o cadastro da pessoa, no início eu pergunto se a pessoa deseja fazer o cadastro agora, caso ela digite s ou S então já vai direto pro cadastro, se digitar n ou N ele pula o cadastro e na teoria era pra aparecer no final, caso eu digite qualquer qualquer uma das opções o programa "trava" depois que ele pede o nome, seja fazendo o cadastro no inicio ou no final, se eu retirar o "numregistro = 1;" linha 29 e 81 e a variável "numregistro=0" linha 5, o programa continua normalmente, alguém sabe porque está travando/não continua executando? Ainda estou aprendendo.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
main(){
int i, cpf[15][15], escolhabebida2, bebida, lanche, numregistro=0;
char registro, S, N, s, n, cadastro, nome[31][31], email[31][31], escolhabebida, endereco[200][200], confirmarpedido,registro2;
// system("color B1");
setlocale(LC_ALL, "Portuguese_Brazil");
printf("************************************************************************************************************************\n"); 
printf("* bem vindo ao (nome) *\n");
printf("************************************************************************************************************************"); 
printf("Para fazer algum pedido será necessario que você se registre\nDeseja se registrar agora? (S/N)");
scanf("%c", &registro);

switch (registro){ 
case 's':{
printf("\nDigite seu nome:");
scanf("%s", &nome);
printf("Digite seu email:");
scanf("%s", &email);
printf("Digite seu endereço:");
scanf("%s", &endereco);
printf("Digite seu cpf:");
scanf("%s", &cpf);
printf("\nPara concluir é necessario que você confirme seus dados:\n");
printf("\nNome: %s\nEmail: %s\nEndereço: %s\nCpf: %s", nome, email, endereco, cpf);
printf("\nTêm certeza que digitou certo? (S/N)");
scanf("%s", &registro2);
numregistro = 1;
switch(registro2){
case 'n':{
system("cls");
printf("Faça seu cadastro novamente\n");
printf("\nDigite seu nome:");
scanf("%s", &nome);
printf("Digite seu email:");
scanf("%s", &email);
printf("Digite seu endereço:");
scanf("%s", &endereco);
printf("Digite seu cpf:");
scanf("%s", &cpf);
break;
}
case 'N':{
system("cls");
printf("Faça seu cadastro novamente\n");
printf("\nDigite seu nome:");
scanf("%s", &nome);
printf("Digite seu email:");
scanf("%s", &email);
printf("Digite seu endereço:");
scanf("%s", &endereco);
printf("Digite seu cpf:");
scanf("%s", &cpf);
break;
}
case 's':{
system("cls");
break;
}
case 'S':{
system("cls");
break;
}
}
break;
}
case 'S':{
printf("\nDigite seu nome:");
scanf("%s", &nome);
printf("Digite seu email:");
scanf("%s", &email);
printf("Digite seu endereço:");
scanf("%s", &endereco);
printf("Digite seu cpf:");
scanf("%s", &cpf);
printf("\nPara conluir é necessario que você confirme seus dados:\n");
printf("\nNome: %s\nEmail:%s\nEndereço: %s\nCpf:%s", nome, email, endereco, cpf);
printf("\nTêm certeza que digitou certo? (S/N)");
scanf("%s", &registro2);
numregistro = 1;

switch(registro2){
case 'n':{
system("cls");
printf("Faça seu cadastro novamente\n");
printf("\nDigite seu nome:");
scanf("%s", &nome);
printf("Digite seu email:");
scanf("%s", &email);
printf("Digite seu endereço:");
scanf("%s", &endereco);
printf("Digite seu cpf:");
scanf("%s", &cpf);
break;
}
case 'N':{
system("cls");
printf("Faça seu cadastro novamente\n");
printf("\nDigite seu nome:");
scanf("%s", &nome);
printf("Digite seu email:");
scanf("%s", &email);
printf("Digite seu endereço:");
scanf("%s", &endereco);
printf("Digite seu cpf:");
scanf("%s", &cpf);
break;
}
case 's':{
break;
}
case 'S':{
break;
}
default:{
printf("\nCódigo incorreto, tente novamente\n");
exit(0);
break;
} 
}
break;
}
case 'N':{
printf("\nSerá pedido o seu cadastro no final do pedido\n");
break;
}
case 'n':{
printf("\nSerá pedido o seu cadastro no final do pedido\n");
break;
}
default:{
printf("\nCódigo incorreto, tente novamente\n");
exit(0);
break;
} 
}
// 
// system("cls");
// if (registro == 's' || 'S' ){
// printf("Registre-se para finalizar o pedido\n");
// printf("\nDigite seu nome:");
// scanf("%s", &nome);
// printf("Digite seu email:");
// scanf("%s", &email);
// printf("Digite seu endereço:");
// scanf("%s", &endereco);
// printf("Digite seu cpf:");
// scanf("%s", &cpf);
// }
if (numregistro == 0){
printf("\nDigite seu nome:");
scanf("%s", &nome);
printf("Digite seu email:");
scanf("%s", &email);
printf("Digite seu endereço:");
scanf("%s", &endereco);
printf("Digite seu cpf:");
scanf("%s", &cpf);
}
}

 

Link para o comentário
Compartilhar em outros sites

@nonick12  Olá amigo. Defina dessa forma os nomes para as suas variáveis:

 

int i, escolhabebida2, bebida, lanche, numregistro=0;
char cpf[20], registro, S, N, s, n, cadastro, nome[50], email[50], escolhabebida, endereco[70], confirmarpedido,registro2;

Se continuar dando erro avisa.

Obs: Da próxima vez que for passar um código, use o botão <> (Code) e insira seu código na janela q aparecer, também, no canto inferior direito, selecione a linguagem

 

adicionado 15 minutos depois

Para ler um nome, email, endereco e cpf não há necessidade do uso do & comercial no scanf(). Seria isso:

printf("Digite seu nome: ");
scanf("%s", nome);

Ou, melhor ainda, se quiser ler um nome com sobrenome, por ex. Seria isso:

printf("Digite seu nome: ");
scanf("%[^\n]s", nome);
fflush(stdin); // comando para limpar o lixo do buffer

Esse comando para limpar o lixo do buffer pode ser usado depois d cada comando scanf()

Outro ponto, para verificar se o registro foi digitado de acordo com o esperado seria isso:

 

if (registro == 's' || registro == 'S')

Também recomendo tirar de seu código o comando exit(0). Pois, com esse comando, o programa é encerrado

adicionado 30 minutos depois

Outro ponto importante. No switch não se faz uso de chave para cada case. Seria isso:

 

switch(registro2){
    case 'n':
        system("cls");
        printf("Faça seu cadastro novamente\n");
    
        printf("\nDigite seu nome:");
        scanf("%s", nome);
        fflush(stdin);
    
        printf("Digite seu email:");
        scanf("%s", email);
        fflush(stdin);
    
        printf("Digite seu endereço:");
        scanf("%s", endereco);
        fflush(stdin);
    
        printf("Digite seu cpf:");
        scanf("%s", cpf);
        fflush(stdin);
    
        break;
    case 's':
        // código
        //no final do switch daí sim use chaves para fechar seu comando
    }

 

adicionado 33 minutos depois

Só uma pergunta: Quantas vezes a pessoa precisa fazer o cadastro?

 

Link para o comentário
Compartilhar em outros sites

@giu_d só precisa fazer o cadastro uma vez, no caso do switch, eu estou usando um switch dentro de outro switch, se eu tirar as chaves o dev c++ da erro. Agora deu certo! Muito obrigado. O que significa esse código [^\n] ? As ordens das variáveis podem afetar em algo no código? Eu havia colocado o fflush(stdin); antes, mas continuou com o erro, aí tirei, é obrigatório o uso do fflush sempre que for char ou string? E por que não precisa do & no scanf quando for string? Se puder tirar essas duvidas agradeço!

 

Link para o comentário
Compartilhar em outros sites

21 minutos atrás, nonick12 disse:

O que significa esse código [^\n]

É uma forma para fazer a leitura de uma string com "espaços", por ex, o nome e sobrenome de uma pessoa, tipo: 'Joao da Silva'.

Se apenas colocar o '%s' só vai ser lido o nome. No caso, 'Joao'. O restante do nome, 'da Silva' será ignorado pelo scanf().

Eu prefiro usar o fgets() para ler uma string, como um nome ou uma frase, por ex. Se interessar posso passar a maneira para se usar esse comando.

29 minutos atrás, nonick12 disse:

As ordens das variáveis podem afetar em algo no código?

 

Não. O ideal é apenas declarar as variáveis no início do seu código, tal como você vinha fazendo.

 

37 minutos atrás, nonick12 disse:

é obrigatório o uso do fflush sempre que for char ou string?

 

Obrigatório não é. Apenas é uma maneira muito usada para limpar a 'sujeira do buffer de entrada' após a leitura de um valor via teclado. O comando scanf() sozinho não faz a limpeza adequada para o caso de sujeira no buffer de entrada e, devido a isso, essa "sujeira" pode interferir nas leituras seguintes feitas pelo scanf() no seu código.

Exatamente por isso prefiro o uso do fgets() para ler uma string. Esse comando, desde q usado do modo adequado, faz a limpeza adequado de valores 'sujos' que possam entrar no buffer.

Por exemplo: Quando você digita uma string e dá um "enter", o valor '\n' é adicionado ao final da string e esse caractere pode não ser tratado de modo adequado pelo scanf() e pode interferir nas leituras seguintes feitas pelo scanf()

Link para o comentário
Compartilhar em outros sites

@nonick12

1 hora atrás, nonick12 disse:

E por que não precisa do & no scanf quando for string?

 

O operador & diz respeito ao endereço de memória de uma variável. Para o caso de strings não é necessário colocar o operador & no scanf(), pois o nome da string em si já é um endereço de memória.

Não sei se deu para entender essa parte. Mas se deu ótimo!

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!