Quiz (scanf)

Quiz interativo sobre scanf em C.

Questão 1 — Fundamentos do scanf

int a;
double b;
printf("Enter a: ");
scanf("%d", &a);
printf("Enter b: ");
scanf("%lf", &b);
printf("a is %d, b is %f \n", a, b);
Suponha que você digite 5 para a e 3 para b. O que é impresso?

O que isso imprime?

a is 5, b is 3.000000
a is 5, b is 3
a is 5.000000, b is 3.000000
Explicação: a é um int impresso com %d5. b é um double impresso com %f3.000000 (%f mostra 6 casas decimais por padrão). Ambos os especificadores de formato casam com seus tipos, então a saída está correta.

Questão 2 — E se você esquecer o &?

scanf("%d", a);   // faltou o &!
scanf("%lf", b);  // faltou o &!

O que acontece?

Executa normalmente
Trava assim que a entrada é recebida
Imprime 0
Explicação: O scanf precisa do endereço da variável (prefixado com &). Sem o &, o scanf trata o valor da variável como se fosse um endereço e escreve lá, causando acesso inválido à memória e, muito provavelmente, um travamento.
Para tipos escalares, sempre prefixe os argumentos do scanf com &.

Questão 3 — Tipo errado no scanf

Um int a é lido com %lf, e um double b é lido com %d.
int a;
double b;
scanf("%lf", &a);  // %lf para int!
scanf("%d", &b);   // %d para double!
Se você digitar 3 para a e 5 para b, o que printf("a is %d, b is %f", a, b) imprime?

O que isso imprime?

a is 3, b is 5.000000
a is 0, b is 0.000000 (nenhum valor correto)
Erro de compilação
Explicação: Quando o formato do scanf não casa com o tipo da variável-alvo, ele escreve um número errado de bytes e a variável acaba com um valor incorreto. A saída exata depende da plataforma, mas não vai ser o que você espera.
No scanf, use %d para inteiros e %lf para doubles.

Questão 4 — Lendo dois valores de uma vez

Um padrão em que uma chamada de scanf lê várias variáveis. Repare no espaço entre os especificadores de formato.
int a, b;
printf("Enter two integers: ");
scanf("%d %d", &a, &b);
printf("a=%d, b=%d\n", a, b);
Se o usuário digita 3 7 (com um espaço no meio) e pressiona Enter, o que é impresso?

O que isso imprime?

a=3, b=7
a=3, b=0 (b não é atribuído)
a=37, b=não inicializado (valores concatenados)
Erro de compilação (scanf só aceita uma variável)
Explicação: Uma única chamada de scanf pode ler várias variáveis. O formato "%d %d" lê dois inteiros separados por espaço em branco (espaço, tab ou nova linha).
· Primeiro %d ← primeiro inteiro 3 → a
· Segundo %d ← próximo inteiro 7 → b
Espaço em branco na string de formato significa "pular qualquer quantidade de espaço em branco", então 3 7, 3   7 (vários espaços), ou até entrada quebrada em linhas, todos funcionam.

Questão 5 — Usando %f em um double?

No printf, %f funciona para um double. A mesma regra vale para o scanf?
double x;
printf("Enter a number: ");
scanf("%f", &x);   // %f em vez de %lf!
printf("x = %f\n", x);
Se você digita 3.14 e pressiona Enter, o que é impresso?

O que isso imprime?

x = 3.140000 (funciona bem)
x = 0.000000 ou um número lixo
Erro de compilação
Explicação: Essa é uma pegadinha específica do scanf. O printf aceita %f para um double, mas o scanf exige %lf para um double.
Com %f, o scanf escreve 4 bytes (assumindo um float) no endereço fornecido, o que preenche apenas parcialmente o double de 8 bytes → o valor é lixo.
Lembre-se: no printf, %f serve; no scanf, você deve usar %lf.

Questão 6 — Caracteres extras na string de formato?

Adicionar caracteres extras na string de formato (tratando-a como um prompt) leva a um comportamento surpreendente.
int a;
scanf("a=%d", &a);   // "a=" incluído no formato
printf("a = %d\n", a);
O que acontece se o usuário digitar só 5?

O que acontece?

Imprime "a = 5"
O programa não consome a entrada, e a não é atribuído
"a=" é impresso e depois espera pela entrada
Erro de compilação
Explicação: Quaisquer caracteres literais na string de formato do scanf significam que a entrada precisa começar exatamente com esses caracteres.
"a=%d" diz "a entrada começa com a=, seguido de um inteiro". Então a=5 funciona, mas um 5 sozinho não casa com o a= inicial, e o scanf não lê, deixando a sem atribuição.
Para mostrar um prompt, imprima-o com um printf separado. Mantenha a string de formato do scanf só com especificadores como %d e %lf.

Questão 7 — Lendo um int e um double em sequência

Um padrão comum em que scanf é chamado duas vezes para ler tipos diferentes.
int age;
double height;
printf("Age: ");
scanf("%d", &age);
printf("Height (cm): ");
scanf("%lf", &height);
printf("%d years, %.1fcm\n", age, height);
Se o usuário digita 25 (Enter) e depois 170.5 (Enter), qual é a saída?

O que isso imprime?

25 years, 170.5cm
25 years, 170.500000cm
Erro (para na segunda entrada)
25 years, 0.0cm (segundo valor não lido)
Explicação: Desde que você pareie cada tipo com o especificador de formato correto (%d com &int, %lf com &double), você pode chamar scanf seguidamente quantas vezes precisar. Novas linhas entre entradas são tratadas automaticamente.
O printf final usa %.1f, então a saída é 170.5 (arredondado para uma casa decimal), não 170.500000.
Então o resultado é 25 years, 170.5cm.

Aulas relacionadas

Introdução
printf e scanf
Como usar printf e scanf em C. Referência de especificadores de formato.
Introdução
Quiz (Variáveis e printf)
Quiz interativo sobre variáveis em C e printf.
Introdução
Variáveis
O que são variáveis em C? Guia visual de int, double e char.
← Aula anterior
Aula 6: Quiz (Variáveis e printf)
Próxima aula →
Aula 8: Operadores Aritméticos