Este artículo reúne, de forma práctica, qué tipo de dato corresponde a cada especificador (%d, %f, %s, etc.) en C, tanto para mostrar datos (printf, sprintf, snprintf) como para leer datos (scanf). Incluye además advertencias típicas que provocan errores o resultados inesperados.
1) Idea clave: imprimir no es lo mismo que leer
printf/sprintf/snprintf: formatean y escriben.- Se les pasan valores (no punteros).
scanf: interpreta texto y lee.- Se le pasan direcciones de memoria (punteros) donde guardar lo leído.
- Por eso casi siempre hay que usar
&variable.
Ejemplo rápido:
int edad;
scanf("%d", &edad); // lee y escribe en edad
printf("Edad: %d\n", edad); // imprime el valor
2) Tabla básica de especificadores más usados
Regla: en
scanf, salvo arrays/strings, normalmente se pasa&variable.
2.1 Enteros
| Tipo en C | printf (imprimir) | scanf (leer) | Ejemplo de variables |
|---|---|---|---|
int | %d o %i | %d o %i | int x; |
unsigned int | %u | %u | unsigned int u; |
short | %hd | %hd | short s; |
unsigned short | %hu | %hu | unsigned short us; |
long | %ld | %ld | long l; |
unsigned long | %lu | %lu | unsigned long ul; |
long long | %lld | %lld | long long ll; |
unsigned long long | %llu | %llu | unsigned long long ull; |
Bases numéricas:
| Formato | printf | scanf | Nota |
|---|---|---|---|
| Octal | %o | %o | 075 es octal literal en C |
| Hex | %x / %X | %x / %X | 0xFF es literal hex |
2.2 Reales (punto flotante)
| Tipo en C | printf | scanf | Importante |
|---|---|---|---|
float | %f | %f | En scanf, %f requiere float* |
double | %f / %e / %g | %lf | En scanf, double usa %lf |
long double | %Lf | %Lf | Con L mayúscula |
Ejemplo:
float a;
double b;
scanf("%f %lf", &a, &b);
printf("a=%f b=%f\n", a, b);
2.3 Caracteres y cadenas
| Tipo en C | printf | scanf | Nota |
|---|---|---|---|
char | %c | %c | %c lee un carácter, incluso espacios y \n |
char[] (cadena) | %s | %s | %s lee hasta el primer espacio/tab/nueva línea |
Ejemplos:
char letra;
scanf(" %c", &letra); // Ojo: espacio antes de %c para saltar blancos
printf("%c\n", letra);
char nombre[20];
scanf("%19s", nombre); // ancho máximo: evita overflow
printf("Hola %s\n", nombre);
Muy importante: En
scanf, parachar nombre[20]NO se usa&nombresinonombre.
3) Diferencias típicas entre printf y scanf
3.1 El caso float/double
- Imprimir (
printf): paradoublese usa%f(y variantes%e,%g). - Leer (
scanf):float→%f(necesitafloat*)double→%lf(necesitadouble*)long double→%Lf
3.2 El caso %c y los espacios
%c no ignora blancos. Si antes hubo un \n pendiente (por ejemplo tras leer un número), el siguiente %c puede capturarlo.
Solución habitual: poner un espacio al inicio del formato:
scanf(" %c", &c); // el espacio consume blancos previos
3.3 Lectura de cadenas con espacios
scanf("%s", ...) no sirve para nombres con espacios (por ejemplo, “Juan Pérez”). Para líneas completas es preferible fgets:
char linea[100];
fgets(linea, sizeof(linea), stdin);
4) sprintf, snprintf y por qué conviene snprintf
sprintf(dest, ...)escribe en un buffer sin límite (peligro de desbordamiento).snprintf(dest, tam, ...)limita el número de caracteres escritos.
Ejemplo:
char out[50];
int edad = 20;
snprintf(out, sizeof(out), "Edad=%d", edad);
puts(out);
5) Especificadores útiles adicionales
5.1 size_t, punteros y otros tipos “modernos”
| Tipo | printf | scanf | Comentario |
|---|---|---|---|
size_t | %zu | %zu | Tamaños (sizeof) |
ptrdiff_t | %td | %td | Diferencia de punteros |
puntero (void*) | %p | (no típico) | Imprimir direcciones |
Ejemplo:
size_t n = strlen("hola");
printf("n=%zu\n", n);
5.2 int8_t, int32_t, int64_t (enteros de tamaño fijo)
Para portabilidad, se recomienda inttypes.h:
- Para imprimir: macros
PRId64,PRIu32, etc. - Para leer: macros
SCNd64,SCNu32, etc.
Ejemplo:
#include <inttypes.h>
int64_t v;
scanf("%" SCNd64, &v);
printf("%" PRId64 "\n", v);
6) Errores frecuentes (y cómo evitarlos)
- Olvidar
&enscanf
int x;
scanf("%d", x); // MAL: x no es dirección
scanf("%d", &x); // BIEN
- Usar
%ssin ancho máximo (overflow)
char s[10];
scanf("%s", s); // Riesgo
scanf("%9s", s); // Mejor
- Confundir
%fy%lfenscanf
double d;
scanf("%f", &d); // MAL
scanf("%lf", &d); // BIEN
- Leer un
charjusto después de un número
int n; char c;
scanf("%d", &n);
scanf("%c", &c); // Captura el '\n' pendiente
scanf(" %c", &c); // Correcto en la mayoría de casos
- Ignorar el valor de retorno de
scanf
scanf devuelve cuántos campos ha leído correctamente. En ejercicios de academia es buena práctica comprobarlo:
int x;
if (scanf("%d", &x) != 1) {
printf("Entrada inválida\n");
}
7) Chuleta rápida (para imprimir y leer)
7.1 printf / sprintf / snprintf
char→%cchar*/char[]→%sint→%dunsigned int→%ulong→%ldlong long→%lldfloat/double→%f(y%e,%g)long double→%Lfsize_t→%zu- puntero →
%p
7.2 scanf
char→" %c"(con espacio si quieres saltar blancos) +&cchar[]→%Ns(con ancho) +nombre(sin&)int→%d+&xunsigned→%u+&ulong→%ld+&llong long→%lld+&llfloat→%f+&fdouble→%lf+&dlong double→%Lf+&ldsize_t→%zu+&z
8) Mini-ejercicios para el alumnado
- Pide por teclado: nombre (sin espacios), edad (int) y altura (double). Imprime una frase con
printf. - Lee un número entero y después un carácter (
S/N). Asegúrate de que el carácter se lee correctamente (pista:" %c"). - Usa
snprintfpara generar una cadena con:"ID=<numero>".
9) Conclusión
Dominar los especificadores de formato evita la mayoría de fallos típicos en C: lecturas incorrectas, comportamientos extraños y errores de memoria. La clave es recordar:
printfimprime valores.scanfguarda en direcciones (normalmente&variable).- En
scanf:float→%f,double→%lf. - En cadenas: usar ancho máximo (
%19s) o preferirfgetspara frases.
¿QUÉ TE HA PARECIDO EL ARTÍCULO? Danos tu opinión al final de la página.
Deja tu comentario y ayúdanos a crecer.
¡SÍGUENOS EN TUS REDES FAVORITAS!
AYUDANOS A CRECER Y QUE LLEGUEMOS A TODAS LAS PERSONAS QUE NOS NECESITANA. SÍGUENOS EN TUS REDES.
Entra AQUÍ y elíge donde seguirnos.

NUESTRAS ÚLTIMAS PUBLICACIONES
- ¡VOLVEMOS A NUESTROS HORARIOS HABITUALES!

- Especificadores de formato en C (printf/sprintf y scanf)

- Propuestas de actividades avanzadas con XML, DTD, XPath y XSLT

- Apuntes extensos de XML y XSLT

- El momento IDEAL para impulsar tu FORMACIÓN y alcanzar tus Metas Académicas: LAS NAVIDADES.

- 20 ejercicios de funciones avanzadas en Python (al estilo de Ackermann)

- Cómo guardar una página web completa en MySQL con PHP (urlencode, BLOB y otras técnicas)

- 60 ejercicios de funciones recursivas en Python para la carrera de Informática

- SIMULACRO 2 – FP Programación de Videojuegos

ELIGE TU RED FAVORITA Y SÍGUENOS.
AYUDANOS A CRECER Y A LLEGAR A TODAS LAS PERSONAS QUE NOS NECESITAN.
Contenido restringido





































































































































































































































































INFORMACIÓN SOBRE 







Comments are closed