Ir para conteúdo
Fórum Script Brasil
  • 0

Sujeira sobrando na leitura


DifusioN

Pergunta

Fala povo, seguinte, to com um programa que está perfeito, rodando redondinho xD....

Mas fui colocar algumas mensagens de erro na digitação de algumas opções e dai que apareceu o problema.

Não sei como em algum momento ainda estão sobrando lixos na digitação...

Analisem ai o trecho e se alguém poder me ajudar eu agradeceria muito!

char sex;
do
{
printf("\nDigite seu sexo(M-Masculino/F-Feminino: ");
getchar(); //limpa a sujeira
sex=getchar(); 
if (sex!='F' && sex!='f' && sex!='M' && sex!='m')
    printf("Sexo invalido, digite novamente!");
}while(sex!='S' && sex!='s' && sex!='M' && sex!='m');

Depois do primeiro teste dar verdadeiro e ele voltar a perguntar o sexo, o programa não está mais identificando as respostas certas, como F e M...

Abraçoss e aguardo respostas...

Editado por DifusioN
Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Cara, é o seguinte, presumo que você seja usuário de alguma distro linux, hehehe, justamente pelo fflush() não ter funcionado. No linux a função que realmente limpa o buffer é a __fpurge():

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

int main(void){
  char sex;
  do {
    printf("Digite seu sexo(M-Masculino/F-Feminino): ");
    __fpurge(stdin);
    sex = getchar();
    sex = toupper(sex); 
    if(sex != 'F' && sex != 'M')
      printf("Sexo invalido, digite novamente!\n");
  } while(sex != 'F' && sex != 'M');

  printf("sexo: %s\n", sex == 'F' ? "feminino" : "masculino");

  return 0;
}

A condição do seu laço do-while também estava errada, porque em vez de 'F', você colocou 'S'. Pra não precisar escrever uma condição muito grande, use a função toupper() da ctype.h pra transformar a letra em maiúscula.

Espero ter ajudado,

[]'s

Link para o comentário
Compartilhar em outros sites

  • 0

Não véio, sou usuário Windows....

Como você pode ver mesmo utilizando o getchar da errado...e a idéia é limpar o que recebe antes, que tem um scanf no meu programa mas não aparece aii....

Sobre transformar em maiúscula eu já sabia, era um passo depois desse programa ai.....xD.....mas irei colokar antes....

Mas mesmo trocando o s/S por f/F ainda está dando errado......

Tem algo errado...vou postar o programa todo...da uma zoiada:

//Cadastro de candidatos - 31/08/09
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int masc=0, fem=0, candh=0,candf=0, tcandid=0, insc, idade, opcao;
    float idademed=0, porch=0, porcf=0;
    char sex, exp;

    printf("\t* * * Menu de Opcoes * * *\n");
    printf("Escolha a Opcao desejada: \n");
    printf("1 - Adicionar um candidato\n");
    printf("2 - Sair\n");
    scanf("%d", &opcao);
    do
    {
        if (tcandid >= 1)
          system("CLS"); //Limpa a tela do Pront de Comando
        switch (opcao)
        {
            case 1:    printf("Digite o numero de inscricao: ");
                    scanf("%d", &insc);
                    fflush(stdin);
                    printf("\nDigite a idade: ");
                    scanf("%d", &idade);
                    fflush(stdin);
                    do
                    {
                    printf("\nDigite seu sexo(M-Masculino/F-Feminino): ");
                    getchar(); //limpa a sujeira de teclas do teclado(do buffer do teclado)
                    sex=getchar(); // Le o caracter e salva na variável sex
                    if (sex!='F' && sex!='f' && sex!='M' && sex!='m') // Testa, se for verdade, da a mensagem de erro
                        printf("Sexo invalido, digite novamente!");
                    }while(sex!='F' && sex!='f' && sex!='M' && sex!='m'); //enquanto for verdade vai fikar requisitando o sexo

                    if (sex>='a' && sex<='z')   //testa se é minúscula e transforma em Maiúscula
                    sex-=32;

                    if(sex=='M') //Soma quantidade de sexos dos candidatos
                        masc=masc+1;
                    else if (sex=='F')
                        fem=fem+1;
                    getchar(); //limpa a sujeira de teclas do teclado
                    printf("\nPossui experiencia?(S/N): ");
                    exp=getchar();

                    if (exp>='a' && exp<='z')   //testa se é minúscula e transforma em Maiúscula
                    exp-=32;

                    if (idade > 18 && sex=='M' && exp=='S') // Testar a quantidade de candidatos (homens/mulheres), maiores de 18 anos e que tenham experiência profissional.
                        candh=candh+1;
                    else if (idade > 18 && sex=='F' && exp=='S')
                        candf=candf+1;

                    tcandid=tcandid+1; //soma o total de candidatos a cada laço
                    idademed=(idademed+idade)/tcandid; //Media das idades
                    porch=(masc*100)/tcandid;
                    porcf=(fem*100)/tcandid;
                    break;

             case 2:    exit (0); //Sai do Programa
             
            default: printf("Opcao Invalida!");
        }
    printf("Adicionar outro Candidato?(1 - Sim/2 - não)");
    scanf("%d", &opcao);
        
    }while(opcao==1);
    
    printf("-----------------------//-----------------------");
    printf("\n\nIdade Media: %.0f", idademed);
    printf("\n\nTotal de Homens: %d, Mulheres: %d", masc, fem);
    printf("\n\nCandidatos Homens, maiores de 18 anos com experiencia: %d",candh);
    printf("\n\nCandidatas Mulheres, maiores de 18 anos com experiencia: %d",candf);
    printf("\n\nTotal de Candidatos: %d",tcandid);
    printf("\n%.0f %% Homens e %.0f %% Mulheres\n\n", porch, porcf);

  system("PAUSE");
  return 0;
}

E o que quer dizer essa sua linha aki do seu programa:

" printf("sexo: %s\n", sex == 'F' ? "feminino" : "masculino"); "

?

Me explica ela ai

Abraçoss e espero respostas! =D

Editado por DifusioN
Link para o comentário
Compartilhar em outros sites

  • 0

DifusioN, beleza então. Dando uma olhada no seu código, só pra fazer algumas observações:

Nesse treço do seu código:

printf("Digite o numero de inscricao: ");
scanf("%d", &insc);
fflush(stdin);
printf("\nDigite a idade: ");
scanf("%d", &idade);
fflush(stdin);
você não precisa limpar o buffer antes de ler um inteiro, basta que você o faça depois de ler um char, pois esse pequeno transtorno de dados sobrando pra próxima leitura estão relacionados a algumas funções que lêem char (como gets(), getchar(), etc). Com a função getchar() você não consegue limpar o buffer porque pra limpar o buffer com, ou seja, ler todos os caracteres que estão na fila esperando por uma leitura, você teria que saber quantos caracteres estão esperando, então o correto seria usar uma função específica pra limpar o buffer, como o fflush() ou __fpurge(), nenhuma das duas está funcionando ? E com relação a linha é simples:
printf("sexo: %s\n", sex == 'F' ? "feminino" : "masculino");
Não sei se você conhece, mas no C há esse operador condicional ternário que funciona como um if e else numa linha só, a linha em cima funciona da mesma maneira que isso aqui:
if(sex == 'F')
   printf("sexo feminino\n");
else
   printf("sexo masculino");

Espero que tenha ajudado,

[]'s

Editado por Arrk
Link para o comentário
Compartilhar em outros sites

  • 0

Po cara, valeu por estar me ajudando ai....funcionou aki de boaa......

valeu mesmo em!!!

Mas tipo, me explica melhor essa parte aki ó:

Com a função getchar() você não consegue limpar o buffer porque pra limpar o buffer com, ou seja, ler todos os caracteres que estão na fila esperando por uma leitura, você teria que saber quantos caracteres estão esperando,

E sobre esse operador condicional eu não conhecia não, valeu por me dar a dica ai!

Abraçosssss

Editado por DifusioN
Link para o comentário
Compartilhar em outros sites

  • 0

 As leituras de chars em geral são bufferizadas, ou seja, ficam em um buffer a espera de uma função de leitura para apanhá-los. Na frase que você citou eu só quis dizer que, como você tava tetando limpar o buffer com a função getchar(), você obrigatoriamente precisava saber quantos caracteres estavam esperando leitura, pra que assim, você possa colocar getchar()'s na mesma quantidade, mas isso seria um tanto absurdo, você teria que lotar o código com inúmeros getchar()'s. Então use uma das duas funções aqui descritas pra limpar o buffer: fflush() ou __fpurge(). 

E outro detalhe, na frase houve um erro de digitação.

Com a função getchar() você não consegue limpar o buffer porque pra limpar o buffer com, ou seja, ler todos os caracteres que estão na fila esperando por uma leitura, você teria que saber quantos caracteres estão esperando

Perceba que quando eu falo "buffer com" eu queria dizer na verdade "buffer com ela, (...)", desculpe por isso, hehehe. E por último, a questão do operador ternário, ele é só uma sentença if-else em uma só linha, a sintaxe é aquela do código, não tem nenhum complicação ;D

Espero que tenha clareado mais as coisas. Se tiver mais alguma dúvida, pode perguntar.

Abraços.

Editado por Arrk
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...