[C] Leiam isto please...

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:
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.
 
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:
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
 
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:
usa a função getchar(); duas vezes. Assim tens de carregar no enter uma vez antes do programa fechar, tipo assim:

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.


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
 
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.

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.

Ou podes meter um system("pause");

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
 
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

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.
 
Esse nível de "rapidez", se existir, é irrisório.
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:
 
Back
Topo