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ícateprintf 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:
- Primero mostramos un mensaje pidiendo la edad
- Esperamos a que el usuario escriba un número y pulse Enter
- El número introducido se guarda en la variable
edad
- 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:
- Debemos asegurarnos de que el array sea lo suficientemente grande para almacenar la entrada
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:
- Solicita dos números y una operación al usuario
- Realiza el cálculo correspondiente
- 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:
- Causar que el programa se bloquee
- Comportarse de manera impredecible
- 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 usamosscanf
para indicar dónde guardar los datos. - Siempre usa
&
con variables de tipoint
,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.
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.
Introducción A C
Introducción Y Entorno
Primer Programa En C
Introducción Y Entorno
Estructura Básica De Un Programa En C
Sintaxis
Operadores Y Expresiones
Sintaxis
Control De Flujo
Sintaxis
Arrays Y Manejo De Cadenas
Sintaxis
Arrays Unidimensionales
Sintaxis
Ámbito De Variables
Sintaxis
Paso De Parámetros
Sintaxis
Entrada Y Salida Básica
Sintaxis
Variables Y Tipos De Datos
Sintaxis
Recursividad
Sintaxis
Control Iterativo
Sintaxis
Control Condicional
Sintaxis
Funciones
Punteros
Punteros
Punteros
Gestión De Memoria Dinámica
Punteros
Aritmética De Punteros
Punteros
Punteros Y Arrays
Punteros
Punteros A Punteros
Punteros
Punteros Y Funciones
Punteros
Memoria Estática Vs Dinámica
Gestión De Memoria
Gestión Segura De Memoria
Gestión De Memoria
Arrays Dinámicos
Gestión De Memoria
Estructuras En C
Estructuras Y Uniones
Uniones Y Enumeraciones
Estructuras Y Uniones
Typedef Y Y Organización De Código
Estructuras Y Uniones
Uniones
Estructuras Y Uniones
Creación De Structs
Estructuras Y Uniones
Enumeraciones
Estructuras Y Uniones
Estructuras Anidadas
Estructuras Y Uniones
Archivos
Io Y Archivos
E/s Binaria Y Formateo
Io Y Archivos
Manipulación Avanzada De Cadenas
Io Y Archivos
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.