C

C

Tutorial C: Entrada y salida básica

Aprende a usar printf y scanf en C para mostrar y leer datos básicos con especificadores %d, %f y %c de forma clara y práctica.

Aprende C y certifícate

printf con especificadores (%d, %f, %c)

La función printf es una de las herramientas más fundamentales en C para mostrar información en la pantalla. Su nombre viene de "print formatted" (impresión con formato), lo que nos da una pista de su principal característica: la capacidad de dar formato a los datos que queremos mostrar.

Sintaxis básica

La sintaxis básica de printf es:

printf("texto y especificadores de formato", valores...);

Donde:

  • El primer argumento es una cadena de texto entre comillas dobles
  • Los argumentos siguientes son los valores que queremos mostrar

Para mostrar un simple mensaje, podemos usar:

printf("Hola, mundo!");

Esto imprimirá exactamente el texto "Hola, mundo!" en la consola. Pero la verdadera utilidad de printf aparece cuando queremos mostrar el valor de nuestras variables.

Especificadores de formato

Los especificadores de formato son marcadores especiales que comienzan con el símbolo % y le indican a printf qué tipo de dato debe esperar y cómo mostrarlo. Cada especificador en la cadena de formato debe corresponder con un valor adicional en la lista de argumentos.

Los especificadores más comunes son:

  • %d: Para mostrar números enteros (int)
  • %f: Para mostrar números con decimales (float, double)
  • %c: Para mostrar caracteres individuales (char)

Mostrando números enteros con %d

El especificador %d se utiliza para mostrar valores enteros:

int edad = 25;
printf("Mi edad es %d años.", edad);

Esto mostrará: "Mi edad es 25 años."

Podemos incluir múltiples valores en una misma llamada:

int manzanas = 5;
int naranjas = 7;
printf("Tengo %d manzanas y %d naranjas.", manzanas, naranjas);

Esto imprimirá: "Tengo 5 manzanas y 7 naranjas."

Es importante que el número de especificadores coincida con el número de variables que pasamos a printf, y que los tipos sean compatibles.

Mostrando números decimales con %f

Para mostrar números con punto decimal (float o double), usamos el especificador %f:

float altura = 1.75;
printf("Mi altura es %f metros.", altura);

Esto mostrará algo como: "Mi altura es 1.750000 metros."

Como puedes ver, por defecto %f muestra 6 decimales. Si queremos controlar la precisión decimal, podemos usar un punto seguido del número de decimales deseados:

float precio = 19.99;
printf("El precio es %.2f euros.", precio);

Esto mostrará: "El precio es 19.99 euros."

También podemos especificar el ancho total del número (incluyendo decimales):

float valor = 123.45;
printf("El valor es %8.2f", valor);

Esto reservará 8 espacios en total para el número (incluyendo el punto decimal y los dígitos después del punto), alineando el resultado a la derecha: "El valor es 123.45"

Mostrando caracteres con %c

Para mostrar un solo carácter, usamos el especificador %c:

char inicial = 'J';
printf("Mi nombre empieza por %c.", inicial);

Esto mostrará: "Mi nombre empieza por J."

También podemos mostrar caracteres según su código ASCII:

printf("La primera letra del alfabeto es %c.", 65);  // 65 es el código ASCII para 'A'

Esto imprimirá: "La primera letra del alfabeto es A."

Combinando especificadores

La verdadera potencia de printf está en combinar diferentes especificadores en una misma llamada:

char grupo = 'B';
int alumnos = 30;
float promedio = 8.75;

printf("El grupo %c tiene %d alumnos con un promedio de %.1f.", grupo, alumnos, promedio);

Esto mostrará: "El grupo B tiene 30 alumnos con un promedio de 8.7."

Caracteres especiales

Dentro de las cadenas de formato podemos usar secuencias de escape para representar caracteres especiales:

  • \n: Salto de línea
  • \t: Tabulación
  • %%: Para mostrar el símbolo %
printf("Línea 1\nLínea 2\tTabulada\n");
printf("El descuento es del 15%% en todos los productos.");

Esto mostrará:

Línea 1
Línea 2	Tabulada
El descuento es del 15% en todos los productos.

Ejemplo práctico

Veamos un ejemplo que combina varios de estos conceptos:

#include <stdio.h>

int main() {
    int edad = 21;
    float altura = 1.82;
    char calificacion = 'A';
    
    printf("Ficha del estudiante:\n");
    printf("-------------------\n");
    printf("Edad: %d años\n", edad);
    printf("Altura: %.2f metros\n", altura);
    printf("Calificación: %c\n", calificacion);
    printf("Porcentaje de asistencia: %.1f%%\n", 98.5);
    
    return 0;
}

Este programa mostrará:

Ficha del estudiante:
-------------------
Edad: 21 años
Altura: 1.82 metros
Calificación: A
Porcentaje de asistencia: 98.5%

La función printf es extremadamente versátil y ofrece muchas más opciones de formato, pero estos especificadores básicos (%d, %f y %c) te permitirán manejar la mayoría de las situaciones comunes al mostrar información en tus programas en C.

scanf para leer del teclado

Mientras que printf nos permite mostrar información al usuario, scanf es la función complementaria que nos permite leer datos desde el teclado. Esta función es esencial para crear programas interactivos que puedan recibir información del usuario durante la ejecución.

Sintaxis básica

La sintaxis básica de scanf es similar a la de printf:

scanf("especificadores de formato", &variables...);

Donde:

  • El primer argumento es una cadena de formato con especificadores
  • Los argumentos siguientes son las direcciones de las variables donde se almacenarán los datos leídos

Leyendo números enteros

Para leer un número entero desde el teclado y guardarlo en una variable, usamos el especificador %d:

int edad;
printf("Introduce tu edad: ");
scanf("%d", &edad);
printf("Tienes %d años.\n", edad);

En este ejemplo:

  1. Primero mostramos un mensaje pidiendo la edad
  2. Esperamos a que el usuario escriba un número y pulse Enter
  3. El número introducido se guarda en la variable edad
  4. Finalmente, confirmamos el dato recibido mostrándolo

Leyendo números decimales

Para leer números con decimales, usamos el especificador %f:

float altura;
printf("Introduce tu altura en metros: ");
scanf("%f", &altura);
printf("Mides %.2f metros.\n", altura);

Al introducir números decimales, podemos usar tanto el punto como la coma como separador decimal, dependiendo de la configuración regional del sistema.

Leyendo caracteres

Para leer un solo carácter, usamos el especificador %c:

char respuesta;
printf("¿Deseas continuar? (S/N): ");
scanf("%c", &respuesta);
printf("Has respondido: %c\n", respuesta);

Es importante tener en cuenta que scanf con %c leerá cualquier carácter, incluyendo espacios, tabulaciones y saltos de línea.

Leyendo cadenas de texto

Para leer palabras o cadenas de texto, usamos el especificador %s:

char nombre[50];  // Array para almacenar hasta 49 caracteres más el terminador nulo
printf("Introduce tu nombre: ");
scanf("%s", nombre);
printf("Hola, %s!\n", nombre);

Hay dos consideraciones importantes al leer cadenas:

  1. Debemos asegurarnos de que el array sea lo suficientemente grande para almacenar la entrada
  2. scanf con %s solo lee hasta el primer espacio en blanco, por lo que solo capturará la primera palabra

Leyendo múltiples valores

Podemos leer varios valores en una sola llamada a scanf:

int dia, mes, anio;
printf("Introduce tu fecha de nacimiento (DD/MM/AAAA): ");
scanf("%d/%d/%d", &dia, &mes, &anio);
printf("Naciste el %d/%d/%d\n", dia, mes, anio);

En este ejemplo, el usuario debe introducir la fecha con el formato específico (por ejemplo, "15/03/1990").

Problemas comunes y soluciones

El problema del buffer

Uno de los problemas más comunes al usar scanf ocurre cuando mezclamos la lectura de números y caracteres:

int numero;
char letra;

printf("Introduce un número: ");
scanf("%d", &numero);

printf("Introduce una letra: ");
scanf("%c", &letra);  // ¡Esto podría no funcionar como esperamos!

El problema es que cuando introducimos un número y pulsamos Enter, el carácter de nueva línea (\n) queda en el buffer de entrada. Cuando scanf("%c", &letra) se ejecuta, lee este carácter de nueva línea en lugar de esperar a que introduzcamos una nueva letra.

Una solución común es añadir un espacio antes del %c:

printf("Introduce una letra: ");
scanf(" %c", &letra);  // El espacio antes de %c consume cualquier espacio en blanco

Limitando la entrada

Para evitar desbordamientos de buffer al leer cadenas, podemos limitar el número de caracteres a leer:

char nombre[10];  // Solo puede almacenar 9 caracteres más el terminador nulo
printf("Introduce tu nombre (máx. 9 caracteres): ");
scanf("%9s", nombre);  // Limita la lectura a 9 caracteres

Validando la entrada

Es una buena práctica verificar si scanf ha leído correctamente los datos. La función devuelve el número de elementos leídos con éxito:

int edad;
printf("Introduce tu edad: ");
int resultado = scanf("%d", &edad);

if (resultado == 1) {
    printf("Edad leída correctamente: %d años\n", edad);
} else {
    printf("Error al leer la edad\n");
}

Ejemplo práctico: Calculadora simple

Veamos un ejemplo que combina la lectura de diferentes tipos de datos:

#include <stdio.h>

int main() {
    float num1, num2, resultado;
    char operacion;
    
    printf("Calculadora simple\n");
    printf("------------------\n");
    
    printf("Introduce el primer número: ");
    scanf("%f", &num1);
    
    printf("Introduce la operación (+, -, *, /): ");
    scanf(" %c", &operacion);  // Nota el espacio antes de %c
    
    printf("Introduce el segundo número: ");
    scanf("%f", &num2);
    
    switch (operacion) {
        case '+':
            resultado = num1 + num2;
            break;
        case '-':
            resultado = num1 - num2;
            break;
        case '*':
            resultado = num1 * num2;
            break;
        case '/':
            if (num2 != 0) {
                resultado = num1 / num2;
            } else {
                printf("Error: División por cero\n");
                return 1;
            }
            break;
        default:
            printf("Operación no válida\n");
            return 1;
    }
    
    printf("%.2f %c %.2f = %.2f\n", num1, operacion, num2, resultado);
    
    return 0;
}

Este programa:

  1. Solicita dos números y una operación al usuario
  2. Realiza el cálculo correspondiente
  3. Muestra el resultado con formato

La función scanf es una herramienta esencial para la interacción con el usuario en programas de consola, permitiéndonos crear aplicaciones que respondan a las entradas del usuario de manera dinámica.

El & en scanf (sin explicar punteros)

Cuando utilizamos la función scanf para leer datos del teclado, habrás notado que colocamos un símbolo & delante de las variables donde queremos guardar la información. Este símbolo es crucial para el correcto funcionamiento de la función.

int edad;
scanf("%d", &edad);  // Observa el & delante de la variable edad

¿Por qué necesitamos el símbolo &?

El símbolo & le indica a scanf dónde debe almacenar el valor que lee del teclado. Sin este símbolo, la función no sabría en qué lugar de la memoria de la computadora debe guardar el dato introducido por el usuario.

Podemos pensar en las variables como cajas etiquetadas donde guardamos información. Cuando usamos & delante de una variable, estamos proporcionando la "dirección" exacta de esa caja, para que scanf sepa dónde colocar el nuevo valor.

Regla práctica

La regla general es simple: casi siempre necesitarás usar el símbolo & con scanf. Las excepciones principales son:

  • Cuando lees cadenas de caracteres (arrays de tipo char):
char nombre[50];
scanf("%s", nombre);  // No necesita & porque nombre ya es una dirección

Consecuencias de olvidar el &

Olvidar el símbolo & es un error común que puede tener consecuencias graves:

int numero;
scanf("%d", numero);  // ¡ERROR! Falta el símbolo &

Este código podría:

  1. Causar que el programa se bloquee
  2. Comportarse de manera impredecible
  3. Modificar datos en lugares inesperados de la memoria

El compilador generalmente mostrará una advertencia si olvidas el &, pero es importante acostumbrarse a incluirlo siempre.

Ejemplos correctos

Veamos algunos ejemplos del uso correcto del símbolo & con diferentes tipos de datos:

  • Con enteros:
int cantidad;
printf("Introduce una cantidad: ");
scanf("%d", &cantidad);
  • Con números decimales:
float precio;
printf("Introduce el precio: ");
scanf("%f", &precio);
  • Con caracteres individuales:
char opcion;
printf("Selecciona una opción (A/B/C): ");
scanf(" %c", &opcion);  // Nota el espacio antes de %c

Ejemplo práctico: Formulario de datos

Veamos un ejemplo completo que muestra el uso correcto del símbolo & en un pequeño formulario:

#include <stdio.h>

int main() {
    char nombre[50];
    int edad;
    float altura;
    char inicial;
    
    printf("=== Formulario de datos personales ===\n\n");
    
    printf("Nombre: ");
    scanf("%s", nombre);  // Sin & porque es un array
    
    printf("Edad: ");
    scanf("%d", &edad);  // Con & porque es un entero
    
    printf("Altura (en metros): ");
    scanf("%f", &altura);  // Con & porque es un decimal
    
    printf("Inicial de tu segundo nombre: ");
    scanf(" %c", &inicial);  // Con & porque es un carácter
    
    // Mostramos los datos introducidos
    printf("\n=== Datos registrados ===\n");
    printf("Nombre: %s\n", nombre);
    printf("Edad: %d años\n", edad);
    printf("Altura: %.2f metros\n", altura);
    printf("Inicial del segundo nombre: %c\n", inicial);
    
    return 0;
}

Casos especiales

Cuando leemos múltiples valores en una sola llamada a scanf, debemos usar el símbolo & para cada variable (excepto arrays):

int dia, mes, anio;
printf("Fecha (DD/MM/AAAA): ");
scanf("%d/%d/%d", &dia, &mes, &anio);

Resumen

  • El símbolo & es necesario cuando usamos scanf para indicar dónde guardar los datos.
  • Siempre usa & con variables de tipo int, float, double, char, etc.
  • No uses & con arrays (como cadenas de caracteres).
  • Olvidar el & puede causar errores graves en tu programa.

Recordar esta simple regla te ayudará a evitar uno de los errores más comunes al programar en C, especialmente cuando estás comenzando a aprender el lenguaje.

CONSTRUYE TU CARRERA EN IA Y PROGRAMACIÓN SOFTWARE

Accede a +1000 lecciones y cursos con certificado. Mejora tu portfolio con certificados de superación para tu CV.

30 % DE DESCUENTO

Plan mensual

19.00 /mes

13.30 € /mes

Precio normal mensual: 19 €
63 % DE DESCUENTO

Plan anual

10.00 /mes

7.00 € /mes

Ahorras 144 € al año
Precio normal anual: 120 €
Aprende C online

Todas las lecciones de C

Accede a todas las lecciones de C y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a C y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender la función printf y sus especificadores básicos (%d, %f, %c) para mostrar datos.
  • Aprender a usar scanf para leer diferentes tipos de datos desde el teclado.
  • Entender la importancia del símbolo & en scanf para indicar la dirección de memoria.
  • Identificar y solucionar problemas comunes al usar scanf, como el buffer de entrada.
  • Aplicar el uso combinado de printf y scanf en ejemplos prácticos de interacción con el usuario.