Publicidade

Aula 5: scanf — Lendo entrada do teclado

Leia entrada do usuário para variáveis com scanf. Aprenda por que o & importa, a pegadinha do %lf e os bugs mais comuns.

📖 O que você vai aprender nesta página
✅ Essencial
  • scanf("%d", &x); lê para uma variável
  • Sempre coloque o & antes da variável
  • double usa %lf (não %f!)
  • Não coloque caracteres a mais na string de formato
⭐ Leia se tiver tempo
  • Verifique o valor de retorno do scanf para detectar erros
  • Regras de como o scanf pula espaços em branco
  • Problemas com entrada pendente e como resolver
  • Para strings, prefira fgets (mais seguro)

Fundamentos do scanf — o oposto do printf

Se printf manda texto para a tela, scanf lê a entrada do teclado. Eles são a imagem espelhada um do outro.
📤 printf (saída)
printf("%d\n", a);
// imprime a variável a na tela
📥 scanf (entrada)
scanf("%d", &a);
// lê do teclado para a variável a

O padrão clássico

int a;
printf("Enter a: ");   // mensagem de prompt
scanf("%d", &a);       // lê a entrada
printf("a = %d\n", a);
Fluxo: ① pedir com printf → ② ler com scanf → ③ usar o valor. Esse padrão de três passos é o arroz com feijão da E/S no console.

⚠️ Por que & (e comercial) é obrigatório

A regra número um do scanf: coloque & antes de cada variável. Esquecer disso normalmente derruba o programa.
🔴 O que acontece se você esquecer o &
int a;
scanf("%d", a);    // ❌ esqueceu do &
O que acontece:
• O compilador emite um aviso (leve os avisos a sério!)
• Rodar o programa quase sempre resulta em segmentation fault (crash)
• No pior caso: escreve em alguma região de memória não relacionada, causando um bug sutil e difícil de rastrear

O que o & realmente é: o "endereço" da variável

A variável a guarda um valor. &a é o endereço de memória onde a mora.
a = o conteúdo da caixa (o valor)
&a = a localização da caixa (o endereço)

O scanf precisa saber onde colocar o novo valor,
então entregamos o endereço (&a).
💡 Regra prática: sempre coloque & antes de variáveis no scanf e nunca no printf. (O printf só lê o valor — não precisa de endereço.) A mecânica completa é tratada em Fundamentos de Ponteiros.

Exceção: strings (arrays)

char name[50];
scanf("%s", name);   // ← nada de & para nome de array
Por quê: o nome de um array já é um endereço (é uma regra especial de C). Por enquanto, só memorize: "arrays são a exceção".

🧩 O enigma do %lf — lendo um double

No scanf, double usa %lf. É diferente do printf, e é uma fonte clássica de confusão.
TipoEspecificador no scanfEspecificador no printf
int%d%d
float%f%f
double%lf ⚠️%f (%lf também funciona)
char%c%c
string%s%s
🔴 Erro comum: usar %f para um double
double b;
scanf("%f", &b);    // ❌ double precisa de %lf
Resultado: b fica com um valor completamente errado (normalmente 0.0 ou algo enorme). É comportamento indefinido. Compile com -Wall para pegar isso.
Mnemônico: scanf + double → use %lf (o l vem de "long"). Só o scanf é chato com isso.

Simulador de scanf

Digite um valor e pressione Enter para ver como o scanf armazenaria.
Enter a:
variável a
(vazio)
printf("%d", a)

Armadilhas comuns

Armadilha ① & faltando
scanf("%d", &a);
Deixar o & de fora normalmente derruba o programa
Armadilha ② %f para double
scanf("%lf", &b);
No scanf, double precisa de %lf
Armadilha ③ caracteres a mais
scanf("%d\n", &a); ← não adicione \n
scanf("Enter %d", &a); ← não embuta texto
Armadilha ④ scanfs consecutivos
Quebras de linha residuais podem te morder ao misturar %c com outros especificadores.

✅ Modelo seguro

int a;
double b;

printf("Enter int: ");
scanf("%d", &a);

printf("Enter double: ");
scanf("%lf", &b);  // lf!

printf("a=%d, b=%f\n", a, b);

💡 Bônus: verifique o valor de retorno

O scanf devolve a quantidade de itens lidos com sucesso, o que é útil para capturar entradas inválidas.
int a;
if (scanf("%d", &a) != 1) {
    printf("Please enter an integer\n");
    return 1;
}
Para tratar entrada em situações reais, prefira fgets + sscanf. Veja Manipulação Segura de Strings.

Experimente — scanf

O simulador do navegador troca por uma caixa de diálogo onde o scanf normalmente leria do teclado.
scanf_demo.c
Saída
Clique em "Executar" para rodar...
💡 Algumas coisas para tentar
Publicidade

Aulas Relacionadas

Primeiros Passos
printf
Imprimindo valores na tela com especificadores de formato.
Avançado
Fundamentos de Ponteiros
O que o & realmente faz: endereços e ponteiros.
Tópicos avançados
Manipulação Segura de Strings
Alternativas mais seguras: fgets + sscanf.
← Anterior
printf
Próximo →
Teste: Variáveis e printf

Teste de Revisão

Teste seu entendimento desta aula!

Q1. Qual é a forma correta de ler um inteiro para int x;?

scanf("%d", &x);
scanf("%d", x);
scanf(x, "%d");

O scanf precisa do endereço onde deve escrever o valor, então coloque & antes do nome da variável.

Q2. Por que o & é necessário nos argumentos do scanf?

Para passar o endereço da variável, para o scanf poder escrever nela
Para a função poder retornar um ponteiro
Para tratar o valor como uma string

O scanf atualiza a variável de quem o chamou, então precisa de um ponteiro (um endereço) em vez do valor em si.

Q3. Qual é o correto para ler uma string para char name[50];?

scanf("%s", name);
scanf("%s", &name);
scanf("%c", name);

Nomes de array decaem para o endereço do primeiro elemento, então o & não é necessário. O %s lê uma única palavra até encontrar espaço em branco.