Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
nonick12

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

Recommended Posts

Postado (editado)

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);
}
}

 

Editado por nonick12

Compartilhar este post


Link para o post
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?

 

Compartilhar este post


Link para o post
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!

 

  • Curtir 1

Compartilhar este post


Link para o post
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()

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d Entendi, muito obrigado, me ajudou demais!

  • Curtir 1

Compartilhar este post


Link para o post
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!

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






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

×