Jump to content
fpinto

programa para ler tres variavais salta a char

Recommended Posts

fpinto

Boa noite, tenho que fazer um programa que começe por ler 3 variavais, um double um char e um int, mas quer faca

char c;
c=getchar();

ou

char c;
scanf("%c",&c);

Ele simplesmente salta a parte em que le a variavel, ja exprimentei mudar o nome da variavel mudar a posicao ( ler primeiro o inteiro ) mas nao resulta..

Não sei se importa ou não mas estou a usar code::blocks

Desde ja obrigado, fpinto

Share this post


Link to post
Share on other sites
pmg

O que acontece se introduzires "3.14159X42" (sem as aspas), só com um único ENTER depois do 42?

Sem mais código teu, principalmente sem a parte de entrada de dados e o que vem imediatamente antes dos snippets acima, não é possível perceber a razão que leva o teu programa a "saltar a parte em que lê a variável".

A minha ideia é que ele não salta nada, mas lê para a variável um espaço ou um ENTER e falha a ler o inteiro a seguir

Experimenta verificar o que ele lê ...

char c;
c = getchar();
printf("valor do caracter lido: %d\n", c);

char c;
if (scanf("%c", &c) != 1) /* error */;
printf("valor do caracter lido: %d\n", c);

Se o teu computador é compativel com ASCII (99.9% dos desktops são), isto deve dizer-te que o valor é 32, ou 10, ou 13, ou talvez ainda 8.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
fpinto

Este é o codigo todo

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

int main()
{
    char c;
    double decimal;
    int inteiro;

    printf("\nEscreve um numero decimal\n");
    scanf("%lf",&decimal);

    printf("\nescreve um caracter\n");
    c=getchar();

    printf("\nescreve um numero inteiro\n");
    scanf("%d",&inteiro);

    printf("\no que escreves-te virado ao contrario fica: %d, %c, %lf",inteiro, c, decimal);
    printf("\n\n");
    return 0;
}

Ao escrever 3.1355x42 ele dividiu exactamente casa uma das variaveis no sitio certo e o output fica como o exercicio pedia.

Então como posso fazer para o compilador separar os scanf? eles tem um printf no meio nao sei porque considera o enter de um como a leitura do outro..

Cumps, fpinto

Share this post


Link to post
Share on other sites
bubulindo

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

int main()
{
    char c;
    double decimal;
    int inteiro;

    printf("\nEscreve um numero decimal\n");
    scanf("%lf",&decimal);
   getchar(); //lê um enter
    printf("\nescreve um caracter\n");
    c=getchar();
   getchar(); //lê um enter
    printf("\nescreve um numero inteiro\n");
    scanf("%d",&inteiro);
   getchar(); //lê um enter
    printf("\no que escreves-te virado ao contrario fica: %d, %c, %lf",inteiro, c, decimal);
    printf("\n\n");
    return 0;
}

Algo assim?


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Cronometro

Isso acontece porque os getchar vão buscar o que tá no buffer. Quando clicas numa tecla enquanto o programa ta a correr e ainda não tiver aparecido nenhuma opção de input, a tecla onde carregaste vai para o buffer que depois é "descarregada" no getchar.

Para evitar isso deve-se usar um fflush(stdin); antes de um getchar porque limpa o buffer.

char c;
    printf("\nescreve um caracter\n");
    fflush(stdin);
    c=getchar();

Penso que era isto que querias saber, se não for diz :P


Software is like sex: It’s better when it’s free.

Share this post


Link to post
Share on other sites
fpinto

Mas então porque é que isso tambem acontecia com o scanf?

EDIT: bastou um getchar() entre a leitura do decimal e do caracter para funcionar direito. com o fflush(stdin) tambem resulta.

Share this post


Link to post
Share on other sites
Cronometro

Porque se fizeres scanf("%c") também estás a ler um char, assim como se fizeres scanf("%s") ou gets();

Tudo o que esteja relacionado com o input de strings ou chars deve-se sempre limpar o buffer antes.

O uso do getchar() antes do c = getchar(); é um pouco errado. Sim pode-se usar, mas se for mais do que um char no buffer, o getchar(); que queres usar para limpar o buffer, não vai guardar todos o valores que çá estão, pois só lê 1 char


Software is like sex: It’s better when it’s free.

Share this post


Link to post
Share on other sites
pmg

Para evitar isso deve-se usar um fflush(stdin); antes de um getchar porque limpa o buffer.

Sorry ... o fflush(stdin), numa implementação de C Standard, despoleta comportamento indefinido. Segundo as normas da linguagem, não está definido o que acontece quando se faz fflush() a um stream de input (ou a um stream de input/output depois de uma operação de input). Algumas implementações (cough -- Windows -- cough) definem o comportamento do fflush() para este caso especifico, mas usando essa funcionalidade estás a limitar o teu programa a essas implementações. Nota que a documentação do MSDN para fflush() avisa que a funcionalidade de usar a função em streams de input não é Standard (embora esse aviso esteja bem escondido).

Em vez do fflush(stdin) usa uma solução que funciona em todas as implementações:

int ignore_restofline(FILE *stream) {
  int ch;
  while (((ch = fgetc(stream)) != '\n') && (ch != EOF)) /* void */;
  return ch == EOF;
}

Que podes usar da seguinte forma ...

        if (scanf("%d", &var) != 1) /* error */;
        if (ignore_restofline(stdin)) /* EOF detected */;

______________________________________________

C99 Standard (draft): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

C2011 upcoming Standard (draft): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf

fflush() on MSDN: http://msdn.microsoft.com/en-us/library/9yky46tz%28v=vs.71%29.aspx


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
Cronometro

Bem, pelo que estive a ler de facto não se deve mesmo usar o fflush, mas o meu professor diz-me que por enquanto devo usar o fflush.

De qualquer maneira, obrigado pelo aviso :P


Software is like sex: It’s better when it’s free.

Share this post


Link to post
Share on other sites
pmg

... o meu professor diz-me que por enquanto devo usar o fflush.

Despede o gajo!

Isso é o mesmo que um professor de cirurgia ensinar os alunos a ir à casa de banho depois de lavar e desinfectar as mãos.

Aconselho-te a ignorar o conselho do professor e a usares outra forma de limpar o conteúdo (tal como a do exemplo anterior), ou, se não fores gajo para tanto, pelo menos meteres um comentário no código :P

    // if (ignore_restofline(stdin)) /* EOF detected */;
    fflush(stdin); /* tá mal; a linha de cima é melhor mas o professor é teimoso */


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
Cronometro

hmmm, secalhar vou começar a usar essa função.

Tenho de falar melhor com ele... é que ainda tamos a aprender c, vamos agora para os pointers... deve ser por isso que ainda não nos quer ensinar isso.


Software is like sex: It’s better when it’s free.

Share this post


Link to post
Share on other sites
bubulindo

Bem, pelo que estive a ler de facto não se deve mesmo usar o fflush, mas o meu professor diz-me que por enquanto devo usar o fflush.

Aposto que também te diz para não usares o goto... mas não explica.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Cronometro

Aposto que também te diz para não usares o goto... mas não explica.

:o u'r inside my brain!

yap, por acaso até sim.

PS: ele apenas disse que o goto tornava o codigo muito confuso.


Software is like sex: It’s better when it’s free.

Share this post


Link to post
Share on other sites
bubulindo

c é confuso xD obrigado a todos pela ajuda :P

Chinês é confuso, porque assenta num paradigma diferente do nosso. C é como falar Norueguês ou Alemão... não é confuso, apenas tens de saber o que dizer.

PS: ele apenas disse que o goto tornava o codigo muito confuso.

Podes ler uma conversa entre um defensor da utilizacão das ferramentas para os fins correctos (usar goto) contra alguém que foi ensinado a nunca usar sem realmente perceber porquê.

http://kerneltrap.org/node/553/2131

O goto torna o código confuso quando se utiliza à toa e por todo e qualquer motivo quando existem melhores instrucões para o que pretendemos. No entanto, em C o goto até tem um ponto forte, que é a utilizacão de labels descritivas.

Eu programo imenso em Statement Lists com autómatos S7 e lá não tenho if, nem for, nem while... e goto (ou Jump condicional e incondicional) apenas permite ter uma label com 4 caracteres. Aí sim, é confuso e complicado... em C, se bem usado pode tornar o código menos confuso.

Mas não leves isso a peito contra o teu professor, certamente que quem lhe ensinou programacão lhe disse o mesmo e ele só está a transmitir a mensagem.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Cronometro

c é confuso xD obrigado a todos pela ajuda :P

C não é confuso... eu adoro C!

Podes ler uma conversa entre um defensor da utilizacão das ferramentas para os fins correctos (usar goto) contra alguém que foi ensinado a nunca usar sem realmente perceber porquê.

http://kerneltrap.org/node/553/2131

O goto torna o código confuso quando se utiliza à toa e por todo e qualquer motivo quando existem melhores instrucões para o que pretendemos. No entanto, em C o goto até tem um ponto forte, que é a utilizacão de labels descritivas.

Eu programo imenso em Statement Lists com autómatos S7 e lá não tenho if, nem for, nem while... e goto (ou Jump condicional e incondicional) apenas permite ter uma label com 4 caracteres. Aí sim, é confuso e complicado... em C, se bem usado pode tornar o código menos confuso.

Mas não leves isso a peito contra o teu professor, certamente que quem lhe ensinou programacão lhe disse o mesmo e ele só está a transmitir a mensagem.

Tive a ler isso. Continuo a achar que não devo usar, mas não porque alguem me diz para não usar ou porque é uma má prática de programação.. mas sim porque ainda não tive necessidade de usar o goto. Talvez no futuro venha a usar :)


Software is like sex: It’s better when it’s free.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.