1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Dúvida em C

Discussão em 'Programação' iniciada por S7sRuss, 21 de Janeiro de 2007. (Respostas: 23; Visualizações: 1984)

  1. S7sRuss

    S7sRuss What is folding?

    Estou a fazer um programa simples em C que pede-nos o nosso sexo e estado civil.
    Há uma parte do código que é a seguinte:
    O problema é que quando respondemos á primeira pergunta fica guardado na memória mais de 3 letras. Ex: masculino, feminino. Logo o primeiro scanf detecta o m ou o f e o segundo scanf detecta o a ou o e.
    Mas pretendo que o primeiro scanf registe a primeira letra da primeira pergunta e o segundo scanf registe a primeira letra da segunda pergunta.
    Ex:
    Qual o seu sexo: Masculino (o 1º scanf tem de registar M)
    Qual o seu estado civil: Solteiro (o 2º scanf tem de registar S)
     
  2. HecKel

    HecKel The WORM

    tu gazes um scanf de um char, tens mais chars na memória por ler, é normal serem lidos no scanf seguinte.

    usa o getchar().

    abraços, HecKel
     
  3. Warrior

    Warrior Power Member

    O getchar produz o mesmo resultado.
    Le para um char[] e depois retira-lhe o primeiro caracter, que fica guardado na posição 0.
     
  4. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    assumindo que confirmas cada palavra com um <Enter>, isto deve resolver o problema

    Código:
    puts(...);
    scanf(...);
    while(getchar()!='\n');
    puts(...);
    scanf(...);
    while(getchar()!='\n');
     
  5. Cesaria

    Cesaria Power Member

    Bem eu faria como o warrior disse:

    char sexo[20],est_civil[20];
    puts(
    "Qual o seu sexo: ");
    scanf(
    "%s",sexo);
    puts(
    "Qual o seu estado civil: ");
    scanf(
    " %s",est_civil);
    printf(
    "O resultado e:%c %c\n",sexo[0],est_civil[0]);

    Mas existem várias formas de o fazer :) ..
     
  6. S7sRuss

    S7sRuss What is folding?

    Já deu =)

    Obrigado Rui Carlos. :)
    O while(getchar()!='\n'); resolveu o problema.
    Podes me explicar como funciona essa instrução?

    Aqui fica o código que escrevi:
     
  7. _freelancer_

    _freelancer_ Power Member

    Desculpem lá intervir e sem ofensa às partes interessadas mas a solução do Rui Carlos é de longe a mais "sapateira", a solução mais pitoresca no mínimo.

    Contudo, se ainda assim queres ser teimoso e não usar a solução do Warrior, pelo menos faz:
    Código:
    puts(...);
    scanf(...);
    fflush(stdin);
    puts(...);
    scanf(...);
    fflush(stdin);
    Resolver isto com um While devia ser crime :P
     
  8. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    e ficas à espera que o 'fflush(stdin);' te limpe o buffer de entrada... o problema é se ele não fizer isso!!! estás-te a esquecer que em ANSI C, a função 'fflush' é suposto ser aplicada a buffer abertos para escrita, sendo o efeito em buffers abertos para leitura (como é o caso do 'stdin') indefinido!!

    dependendo do SO que estás a usar, pode ser que tenhas disponível a função 'fpurge', essa sim limpa buffer de entrada (mas não é ANSI).

    por isso parece-me que é mais crime resolver isto com um 'fflush' do que com um 'while' (já agora, podes-me dizer qual é o crime de resolver isto com um 'while'? e estar a criar variáveis para ler lixo também não é crime? por que não ignorá-lo simplesmente? acho a solução do Warrior perfeitamente válida, mas não seria a que eu utilizaria).

    -----------

    já me esquecia de explicar a instrução...

    o while(getchar()!='\n'); executa a função getchar até que esta leia um '\n', ou seja, lê todos os caracteres até encontrar o primeiro '\n' (inclusivé). se tinhas no buffer os caracteres "asculino\n" eles serão todos lidos.
     
    Última edição: 21 de Janeiro de 2007
  9. _freelancer_

    _freelancer_ Power Member

    Pois, enfim ... devo ser muito estúpido então por preferir a minha solução que funciona e para uma string com uma infinidade caracteres é simplesmente muito mais efectiva que solução do while (que vai percorrer a string toda até achar o \n [só a ideia da carga que isto é para strings grandes dá-me arrepios]).

    Big deal, não é ANSI C e os resultados são "indefinidos" ... pois claro, tem graça que sempre que a usei (em Windows e Linux com o Borland C++ Builder e gcc) funcionou sempre às mil maravilhas como era esperado.

    Mas enfim, leva lá a bicicleta. Deixa-me lá ficar estúpido com as minhas soluções de programação que nem funcionam e fica lá tu com as tuas ;)
     
  10. dark_splinter

    dark_splinter Power Member

    se fize-se o programa também usaria o fflush(stdin) .... por acaso n sabia que o fflush() era apenas usado para limpar o buffer abertos para escrita .... :)...

    A mim até agora nunca me deu problemas a usar em buffer abertos para leitura....

    Existe alguma função mesmo propria de ANSI C para limpar o buffer aberto para leitura?
     
  11. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    é curioso que o nunca vi o fflush a funcionar (tanto em Linux como em MacOSX), devo ser muito estúpido para isto acontecer...

     
  12. _freelancer_

    _freelancer_ Power Member

    Mas tens melhor ainda, se o facto de não ser ANSI C te faz tanta comichão e já que sabes tanto de programação, podes sempre arranjar uma solução para limpar o buffer de entrada que não implique percorrer a string toda.

    Tem de haver alguma forma...
     
  13. dark_splinter

    dark_splinter Power Member

    Por acaso só programo em windows, por emquanto... e nunca me deu problemas ... foi só por isso que referi :D ...

    Mas tem de haver alguma função para n termos de correr a string toda como o _freelancer_ tá a dizer...
     
  14. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    se não fosse ANSI mas estivesse dentro de outro standard que me garantisse que ela funcionaria, não tinha problemas em usá-la.

    mas pelo que tenho lido lido na net, essa função só limpa o stdin em Windows (e como só programo em C para ambientes Unix, tenho que arranjar outra forma de resolver o problema).
     
  15. dark_splinter

    dark_splinter Power Member

    Sempre pode se usar a função rewind()....

    rewind(stdin);

    apesar que supostamente n vai limpar o buffer mas resolve nos o problema...
     
  16. S7sRuss

    S7sRuss What is folding?

    Todas as sugestões que me deram funcionam em Windows.
    Podem me explicar como funciona o fflush(stdin) e o rewind(stdin)?
     
  17. dark_splinter

    dark_splinter Power Member

    Como deves saber sempre que é executado um programa em C são abertos 5 ficheiros standart...

    stdin -> normalmente associado ao teclado
    stdout -> normalmente associado ao monitor
    stderr -> para onde deves mandar as mensagens de erro...
    ...
    ...

    quando fazes fflush(stdin) supostamente tás a limpar o que está no buffer do stdin ... ficando assim vazio....

    rewind(stdin) mete o apontador do stdin a apontar para o começo do buffer....

    provavelmente devo-te estár a enganar em alguns detalhes.... por isso espera que alguém confirme....
     
  18. SiR_vIRciado

    SiR_vIRciado What is folding?

    Não seria mais facil fazer isto no 2º scanf, scanf(" %c",&est_civil),ou seja meter um espaço no " %c" de forma a limpar-mos o buffer do teclado.
    O getchar que falaram faz exactamente a mm coisa quando utilizado associado ao \n,ou seja limpa o buffer..

    Obrigado
    Cumps
     
    Última edição: 21 de Janeiro de 2007
  19. dark_splinter

    dark_splinter Power Member

    épa eu por acaso nem me lembrei disso .... a primeira vez que precisei de limpar o buffer fiz assim.... depois habituei-me ao fflush(stdin) que pelo que houvi nem se deve usar....
     
  20. SiR_vIRciado

    SiR_vIRciado What is folding?

    Eu bem mais basico,e amigo "houvi" é que não =P
    abraço[]
     

Partilhar esta Página