Armadilhas comuns de E/S
Problemas com buffer e nova linha.
Armadilhas comuns de E/S é uma aula grátis de C Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C Academy inclui 4 aulas no total.
Erros comuns de E/S
A entrada e a saída em C têm algumas armadilhas clássicas. Conhecê-las economiza horas de depuração.
#include <stdio.h>
int main(void) {
printf("Let us study I/O pitfalls\n");
return 0;
}A quebra de linha restante
Depois de scanf("%d", ...), a tecla Enter deixa um \n no buffer. Um %c posterior lê essa quebra de linha em vez da entrada real.
#include <stdio.h>
int main(void) {
char c = 'A';
printf("Use a space before %%c to skip the leftover newline\n");
printf("c = %c\n", c);
return 0;
}Corrigindo com um espaço
Escrever scanf(" %c", &c) com um espaço inicial informa a scanf para ignorar primeiro os espaços em branco.
#include <stdio.h>
int main(void) {
char c = 'Z';
printf("scanf(\" %%c\", &c) skips whitespace\n");
printf("c = %c\n", c);
return 0;
}Esquecendo o e comercial
Passar uma variável para scanf sem & armazena o valor em um endereço incorreto e provavelmente causa uma falha.
#include <stdio.h>
int main(void) {
int n = 9;
printf("Always pass &n, not n, to scanf for an int\n");
printf("n = %d\n", n);
return 0;
}Especificadores incompatíveis
Ler um double com %f em vez de %lf em scanf corrompe o valor. A saída usa %f para ambos, mas a entrada é diferente.
#include <stdio.h>
int main(void) {
double d = 2.5;
printf("scanf needs %%lf for double; printf uses %%f\n");
printf("d = %.1f\n", d);
return 0;
}Armazenamento em buffer da saída
A saída pode ser armazenada em buffer e não aparecer imediatamente. Terminar com \n ou chamar fflush(stdout) esvazia o buffer.
#include <stdio.h>
int main(void) {
printf("Flushed by newline\n");
fflush(stdout);
return 0;
}gets é perigosa
A antiga função gets não verificava os limites e foi removida do C moderno. Use fgets em vez dela.
#include <stdio.h>
int main(void) {
char buf[10];
/* fgets(buf, sizeof buf, stdin); */
buf[0] = 'H'; buf[1] = 'i'; buf[2] = 0;
printf("buf = %s\n", buf);
return 0;
}Estouro de buffer com %s
Um %s simples em scanf pode escrever além dos limites de uma matriz pequena. Limite-o com uma largura, como %19s.
#include <stdio.h>
int main(void) {
char name[20];
printf("Use %%19s to leave room for the null terminator\n");
name[0] = 0;
printf("name length cap protects buffer\n");
return 0;
}fgets mantém a quebra de linha
fgets armazena a quebra de linha final. Muitas vezes é necessário removê-la.
#include <stdio.h>
#include <string.h>
int main(void) {
char line[] = "hello\n";
line[strcspn(line, "\n")] = 0;
printf("[%s]\n", line);
return 0;
}Ignorando valores de retorno
Não verificar o valor de retorno de scanf permite que uma entrada inválida passe despercebida. Verifique sempre.
#include <stdio.h>
int main(void) {
int n = 3;
int items = 1;
if (items != 1)
printf("bad input\n");
else
printf("ok: %d\n", n);
return 0;
}Reunindo tudo com segurança
Um padrão robusto: leia com fgets, analise com sscanf e verifique o resultado.
#include <stdio.h>
int main(void) {
char line[] = "123";
int n;
if (sscanf(line, "%d", &n) == 1)
printf("parsed %d\n", n);
return 0;
}Verificação rápida
Teste sua compreensão das armadilhas de E/S.
Recapitulação: armadilhas comuns de E/S
Você aprendeu a evitar erros comuns.
- Quebras de linha restantes confundem
%c; use um espaço inicial - Sempre passe endereços com
& - Use
%lfpara ler valores double - Prefira
fgetsagetse limite%s - Verifique os valores de retorno e esvazie o buffer da saída
Perguntas Frequentes
A aula “Armadilhas comuns de E/S” é grátis?
Sim — o texto completo de “Armadilhas comuns de E/S” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C Academy, atualize para CoddyKit PRO. O curso de C Academy inclui 4 aulas no total.
O que vou aprender em “Armadilhas comuns de E/S”?
Problemas com buffer e nova linha. Você pratica C Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C Academy?
Nenhuma experiência prévia é necessária. C Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Armadilhas comuns de E/S”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C Academy?
Sim. Cada aula de C Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Especificadores de formato de printf
- scanf e entrada
- Largura, precisão e flags
- Armadilhas comuns de E/S