Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Ajuda mostrar dados


Leo Silva
 Share

Question

Eu sou novato ainda e como todo novato tenho as minhas duvidas, esse algoritmo (?) da o seguinte erro: ele armazena a variável evento, pula a corrida e volta a armazenar o tempo. Eu quis deixar tudo separado por curiosidade mesmo, já testei com todos os dados sendo armazenados no primeiro printf e deu certo. ^^

#include <conio.h>
#include <stdio.h>

int main()
{
    int evento;
    char corrida;
    float tempo;

    printf("Digite o numero do evento\n");
    scanf("%d", &evento);
    
    printf("Digite qual o nome da corrida\n");
    scanf("%c", &corrida);
    
    printf("Digite o tempo estimado de termino\n");
    scanf("%f", &tempo);
    
    printf("O tempo na corrida %c do evento de numero %d foi de %f \n", corrida, evento, tempo);
    
    getch();
}

Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0

Esse "problema" não é (exatamente) culpa sua. A função scanf é uma droga. Radical, eu sei, mas ela tem tantos problemas associados a ela que seria melhor simplesmente não usá-la.

Primeiro vou explicar o que está acontecendo.

A função scanf lê apenas o que você pede para ela ler. No seu caso, você está pedindo para ela ler um número, e apenas isso.

Só que temos um problema: quando você está digitando o valor no console, você não está digitando apenas um número...

Mas como não, Durub?! Eu tenho certeza que estou digitando apenas o número!

Certo, eu acredito em você! Mas tem um detalhe: a tecla Enter. Quando você está inserindo o número, além do número você também está inserindo uma nova linha.

Ou seja, seria mais ou menos isso:

1. Você digita "125"

2. Você aperta enter

3. O programa recebe, na verdade, "125\n", e não "125"

4. O seu scanf lê "125" e deixa "\n" sobrando na entrada

O que acontece é que, quando o segundo scanf (da corrida) vai rodar, ele lê esse \n que está no buffer de entrada. (stdin)

Agora, vou sugerir umas soluções para o seu problema.

Solução 1) Você pode ler o \n direto no scanf.

Trocando "scanf("%d", &evento)" para "scanf("%d%*c", &evento)", você estará lendo um caractere (\n) e o ignorando (é isso que o * no %*c faz).

Solução 2) Você pode parar de usar o scanf diretamente e usar fgets + sscanf. (recomendo)

Exemplo:

char buf[1024];
int evento;
char corrida;
float tempo;

fgets(buf, 1024, stdin);
sscanf(buf, "%d", &evento);

fgets(buf, 1024, stdin);
sscanf(buf, "%c", &corrida);

fgets(buf, 1024, stdin);
sscanf(buf, "%f", &tempo);

Isso elimina (quase) todos os problemas associados ao recebimento de input do usuário.

Abraços!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.9k
    • Total Posts
      648.8k
×
×
  • Create New...