La entrada es el alma de cualquier programa interactivo. Sin él, simplemente estás ejecutando una calculadora en el vacío. En el lenguaje de programación C, el caballo de batalla para capturar datos del teclado es “scanf”. Es sencillo. Está en todas partes. Pero también es conocido por no perdonar cuando las cosas van mal.
Para scripts básicos o prototipos rápidos, “scanf” hace el trabajo. Lee desde stdin (entrada estándar). Si estás escribiendo en un teclado, ahí es donde aterrizan tus personajes. La función es versátil, pero carece de un manejo sólido de errores. No le importa si escribe una letra cuando espera un número. Simplemente se quedará ahí, o peor aún, bloqueará su programa. Es por eso que es excelente para tareas simples pero deficiente para software de producción.
La sintaxis y el signo comercial
Veamos el caso de uso más simple posible. Quieres un número entero. Tú lo pides. Lo guardas.
scanf("%d", &b);
Eso es todo. Dos argumentos. La cadena de formato y el destino.
El %d le dice a scanf que espere un número entero. Es el mismo marcador de posición que usas en “printf”. La variable b debe declararse como int. Si no es así, estás buscando problemas.
Aquí está la parte que siempre hace tropezar a los principiantes: el signo comercial (& ).
&b no es un error tipográfico. Es un puntero. Específicamente, es la dirección de la variable b. scanf no toma el valor; necesita la ubicación de la memoria para escribir la entrada. Olvídese del &. Su código podría compilarse. ¿Pero cuando lo ejecutas? Chocar. Error de segmentación. Vacío. Es casi seguro que el programa finalizará abruptamente porque intenta escribir en una dirección de memoria aleatoria.
Banderas de formato
scanf usa los mismos especificadores de conversión que printf. Si conoces uno, conoces el otro. Pero el contexto importa.
- Enteros :
%d - Números de punto flotante :
%f - Caracteres individuales :
%c - Cadenas :
%s
Mantenlos rectos. Cambie un %f por un número entero y obtendrá datos basura o un bloqueo.
Por qué scanf no es suficiente
Puedes encadenar llamadas scanf para leer múltiples valores.
Esto funciona para números. Está lo suficientemente limpio. ¿Pero intenta leer una línea completa de texto? Se rompe. scanf con %s se detiene en el primer espacio en blanco. No lee toda la línea. Y no maneja de forma segura los desbordamientos del búfer.
Para programas reales, debes evitar “scanf” para la entrada de texto. En su lugar, utilice “gets” (que está en desuso y es peligroso) o, preferiblemente, “fgets”. Estas funciones leen una línea a la vez en un búfer. Una vez que tenga la línea, puede analizarla. Puedes comprobar si hay errores. Puede validar que la entrada parezca un número antes de intentar convertirla. scanf omite este paso. Se supone que sabes lo que estás haciendo. Normalmente no lo haces.
Rompiendo cosas a propósito
La mejor manera de aprender C no es leyendo documentación. Es rompiendo el compilador.
Tome este fragmento:
Modifícalo. Hazlo peor.
Elimine b de la declaración de variable. Observe al compilador gritar sobre una variable indefinida.
Elimina un punto y coma. Vea cómo se propaga el error de sintaxis.
Quitar un aparato ortopédico. Observe cómo el analizador pierde la cabeza.
Eliminar un paréntesis. Observa la confusión






































