0Pricing
C Academy · Aula

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 %lf para ler valores double
  • Prefira fgets a gets e 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

  1. Especificadores de formato de printf
  2. scanf e entrada
  3. Largura, precisão e flags
  4. Armadilhas comuns de E/S
← Voltar para C Academy