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

[C] Leiam isto please...

Discussão em 'Programação' iniciada por mrjm, 28 de Setembro de 2008. (Respostas: 14; Visualizações: 1172)

  1. mrjm

    mrjm Power Member

    eu acho que voces nao perceberam a minha duvida...
    Código:
    
    [INDENT]#include <stdio.h>
    int main( void ) {
    int anoNascimento;
    int anoActual = 2007;
     
    printf( "Introduza o ano de nascimento: " );
    scanf("%d", &anoNascimento );
    if ( anoNascimento == anoActual - 1 )
    printf( "No fim de %d tera 1 ano.\n", anoActual );
    else
    printf( "No fim de %d tera %d anos.\n", anoActual, anoActual - anoNascimento );
     
    return 0;
    }
    [/INDENT]
    este programa apos inserida a data (no primeiro printf) fecha logo, este e qualquer outro programa... com o dev c++ tipo a linha de coamandos fecha sem dar o resultado imprimido no ecrã por exemplo :
    "No fim de 2007 tera 18 anos."
     
    Última edição pelo moderador: 28 de Setembro de 2008
  2. sapropel

    sapropel Power Member

    ele imprime, mas fecha a janela tão rapido que parece que nem o imprime.
    tens de fazer algo para ele parar antes de sair tipo outro scanf();
    Código:
    #include <stdio.h>
    int main( void ) {
    int anoNascimento;
    int anoActual = 2007;
    
    printf( "Introduza o ano de nascimento: " );
    scanf("%d", &anoNascimento );
    if ( anoNascimento == anoActual - 1 )
    printf( "No fim de %d tera 1 ano.\n", anoActual );
    else
    printf( "No fim de %d tera %d anos.\n", anoActual, anoActual - anoNascimento );
    
    printf("prima ENTER para sair.\n");
    scanf("");
    return 0;
    }
    tens outras opçoes usando c++ tipo std::cing.get(); ou mm std::cin >> variavel
    alguêm ha-de recomendar system("PAUSE"); também, mas isso é non-standard e horrivel.
     
  3. mrjm

    mrjm Power Member

    nope mm com essa opção ele sai logo... nao mostra nada.... e estranho!!! e tipo quando eu ponho mais de 2 printf seguidos

    Código:
     
    printf("insira data");
    scanf("%d", num1);
    printf("insira numero");
    scanf("%d", num2);
    
    o programa deixa de responder e da aquele erro no xp do genero (enviar ou nao enviar) e no vista diz que o programa deixou de responder e depois fecha
     
    Última edição pelo moderador: 28 de Setembro de 2008
  4. MPalhas

    MPalhas Power Member

    falta-te o & no scanf:

    Código:
    scanf("%d", [COLOR=Red]&[/COLOR]num1);
    nos scanf's tens que o ter sempre antes das variaveis. quando avançares mais na linguagem vais perceber porque
     
  5. Peter V5

    Peter V5 Folding Member

    usa a função getchar(); duas vezes. Assim tens de carregar no enter uma vez antes do programa fechar, tipo assim:

    Código:
     
    #include <stdio.h>
    int main( void ) {
    int anoNascimento;
    int anoActual = 2007;
     
    printf( "Introduza o ano de nascimento: " );
    scanf("%d", &anoNascimento );
    if ( anoNascimento == anoActual - 1 )
    printf( "No fim de %d tera 1 ano.\n", anoActual );
    else
    printf( "No fim de %d tera %d anos.\n", anoActual, anoActual - anoNascimento );
     
    getchar();
    getchar();
     
    return 0;
    }
    
    Tens de o usar antes do return 0; porque o return serve para acabar a função mais, logo acaba o programa, e se o programa contem algum scanf tens de utilizar o getchar(); duas vezes, sempre, não sei bem explicar porquê mas não intereça, lolol.
     
    Última edição pelo moderador: 28 de Setembro de 2008
  6. mrjm

    mrjm Power Member

    Raapz como e obvio eu pus, isso era so um exemplo lol
     
  7. DSantosP

    DSantosP Folding Member


    Só sei que tem qualquer coisa haver com o buffer do teclado.

    Não é preciso colocar dois getchar(), basta antes do primeiro colocar fflush(stdin), isto vai limpar o buffer o teclado, logo o programa não coloca nenhum carácter directamente no getchar(), ficando o programa há espera que o utilizador clique numa tecla do teclado para o programa avançar.

    Código:
    #include <stdio.h>
    int main( void ) {
    int anoNascimento;
    int anoActual = 2007;
    
    printf( "Introduza o ano de nascimento: " );
    scanf("%d", &anoNascimento );
    if ( anoNascimento == anoActual - 1 )
    printf( "No fim de %d tera 1 ano.\n", anoActual );
    else
    printf( "No fim de %d tera %d anos.\n", anoActual, anoActual - anoNascimento );
    
    fflush(stdin);
    getchar();
    
    return 0;
    }
    Penso que existem outras maneiras de limpar o buffer do teclado, eu só conheço esta.

    DSantosP
     
  8. Peter V5

    Peter V5 Folding Member

    Á, porreiro, obrigado
     
  9. Tyran

    Tyran Power Member

    Ou podes meter um system("pause");

    cumpzz
     
  10. Peter V5

    Peter V5 Folding Member

    ya, com isso não se teria de por o fflush(stdin);
     
  11. DSantosP

    DSantosP Folding Member

    Essa é outra forma de para o programa, não se esqueçam é de colocar a biblioteca stdlib.h.

    DSantosP
     
  12. Baderous

    Baderous Banido

    O fflush não deve ser aplicado a buffers de entrada como o stdin pois o seu comportamento não está definido para esses casos.

    Usar instruções dependentes do SO para "a janela não fechar" é má prática.

    Solução:

    Código:
    scanf("%*[^\n]");
    scanf("%*c");
    http://www.portugal-a-programar.org/forum/index.php/topic,12638.0.html
     
  13. Peter V5

    Peter V5 Folding Member

    Excelente post, e boa solução., mas quanto á parte do depender do soft, se for em windows é uma solução mais rápida e facil do que a ultima.
     
  14. Baderous

    Baderous Banido

    Esse nível de "rapidez", se existir, é irrisório.
     
  15. CrazyBomber

    CrazyBomber Power Member

    Acho que ele queria dizer rapidez para o programador :)

    Eu sou a favor da legibilidade do código.


    system("pause")

    é muito mais legível que

    scanf("%*[^\n]");
    scanf("%*c");

    Portanto, entre as duas, decididamente escolheria a primeira :)
    (Um dos problemas actuais: generalização em demasia. Se o programa é só para correr em Windows, por exemplo, porquê complicar?)

    E já agora, o scanf ainda continua tão fiável como sempre? Lembro-me que uma das coisas que eu fazia em C, era implementar imediatamente um método "meu" para ler input do teclado :sad:
     

Partilhar esta Página