0Pricing
C Academy · Lección

Errores comunes de E/S

Problemas con el búfer y el salto de línea

Errores comunes de E/S es una lección gratuita de C Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C Academy incluye 4 lecciones en total.

Errores comunes de E/S

La entrada y la salida en C tienen algunas trampas clásicas. Conocerlas le ahorrará horas de depuración.

#include <stdio.h>
int main(void) {
    printf("Let us study I/O pitfalls\n");
    return 0;
}

El salto de línea sobrante

Después de scanf("%d", ...), la tecla Intro deja un \n en el búfer. Un %c posterior lee ese salto de línea en lugar de la 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;
}

Solución con un espacio

Escribir scanf(" %c", &c) con un espacio inicial indica a scanf que omita primero los espacios en blanco.

#include <stdio.h>
int main(void) {
    char c = 'Z';
    printf("scanf(\" %%c\", &c) skips whitespace\n");
    printf("c = %c\n", c);
    return 0;
}

Olvidar el signo «&amp;»

Pasar una variable a scanf sin & hace que se escriba en una dirección incorrecta y probablemente provoque un fallo.

#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 incompatibles

Leer un double con %f en lugar de %lf en scanf corrompe el valor. La salida utiliza %f para ambos tipos, pero la entrada es 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;
}

Almacenamiento en búfer de la salida

La salida puede almacenarse en un búfer y no aparecer de inmediato. Terminar con \n o llamar a fflush(stdout) la vacía.

#include <stdio.h>
int main(void) {
    printf("Flushed by newline\n");
    fflush(stdout);
    return 0;
}

gets es peligroso

La antigua función gets no comprobaba los límites y se eliminó del C moderno. Use fgets en su lugar.

#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;
}

Desbordamiento de búfer con %s

Un %s sin restricciones en scanf puede escribir más allá de una matriz pequeña. Limítelo con un ancho 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 conserva el salto de línea

fgets almacena el salto de línea final. A menudo es necesario eliminarlo.

#include <stdio.h>
#include <string.h>
int main(void) {
    char line[] = "hello\n";
    line[strcspn(line, "\n")] = 0;
    printf("[%s]\n", line);
    return 0;
}

Ignorar los valores de retorno

No comprobar el valor de retorno de scanf permite que la entrada incorrecta pase inadvertida. Compruébelo siempre.

#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;
}

Cómo encaja todo de forma segura

Un patrón sólido consiste en leer con fgets, analizar con sscanf y comprobar el 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;
}

Comprobación rápida

Compruebe sus conocimientos sobre las dificultades de la E/S.

Repaso: dificultades comunes de la E/S

Ha aprendido a evitar errores comunes.

  • Los saltos de línea sobrantes confunden a %c; use un espacio inicial
  • Pase siempre direcciones con &
  • Use %lf para leer valores double
  • Prefiera fgets a gets y limite %s
  • Compruebe los valores de retorno y vacíe la salida

Preguntas frecuentes

¿La lección «Errores comunes de E/S» es gratis?

Sí — el texto completo de «Errores comunes de E/S» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C Academy, actualiza a CoddyKit PRO. El curso de C Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Errores comunes de E/S»?

Problemas con el búfer y el salto de línea Practicas C Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C Academy?

No se requiere experiencia previa. C Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Errores comunes de E/S»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C Academy?

Sí. Cada lección de C Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Especificadores de formato de printf
  2. scanf y entrada
  3. Ancho, precisión y flags
  4. Errores comunes de E/S
← Volver a C Academy