Cómo leer la entrada del usuario en C con scanf

9

Las constantes son convenientes. Son estáticos. Pero también son aburridos.

Un programa que siempre suma 5 y 7 hace exactamente una cosa. No se adapta. No interactúa. Para que el código C sea realmente útil para los usuarios finales, es necesario dejar de codificar valores y empezar a escuchar.

La herramienta para ese trabajo es “scanf”.

De codificado a dinámico

En el ejemplo anterior, las variables “a” y “b” probablemente se inicializaron con números fijos. La lógica era rígida. El resultado era predecible. Si deseaba cambiar la adición, tenía que editar el código fuente, recompilarlo y ejecutarlo nuevamente.

Eso no es fácil de usar.

Para solucionar este problema, necesitamos capturar la entrada desde la consola. La biblioteca estándar maneja tanto la salida (printf ) como la entrada (scanf ). El cambio de constantes a valores definidos por el usuario convierte el programa de una demostración de calculadora a una simple utilidad.

La sintaxis de scanf

Aquí está el código que lo hace posible:

La lógica es sencilla. Es lineal.

  1. El programa solicita el primer número entero.
  2. scanf espera entrada.
  3. El usuario escribe un número y presiona enter.
  4. El valor se almacena en a.
  5. Repita para b.
  6. Agréguelos.
  7. Imprima el resultado.

La confusión del signo comercial (&)

El punto de falla más común para los principiantes aquí es el símbolo “&”.

Mira esta línea:
scanf("%d", &a);

¿Por qué hay un signo comercial? ¿Por qué no simplemente scanf("%d", a);?

Las variables en C no son sólo nombres. Son direcciones de memoria. Cuando declaras “int a”, estás reservando una porción de RAM. scanf no quiere el valor de a porque a está actualmente vacío (o contiene basura). scanf necesita la dirección donde puede escribir el nuevo valor.

El & es el operador de “dirección de”. Le da a scanf la ubicación en la memoria para que pueda modificar a directamente. Sin él, estás apuntando “scanf” a una parte aleatoria de la memoria. Es probable que el programa falle o, peor aún, corrompa sus datos.

Información clave: printf usa el valor. scanf necesita la dirección.

Especificadores de formato

Usaste %d en printf para mostrar un número entero. Debes usar %d en scanf para leer uno.

No coincidir estos provoca un comportamiento indefinido. Si intenta leer un número entero usando %f (flotante), los datos se interpretarán incorrectamente. El diseño de la memoria de un flotante es diferente al de un número entero. scanf escribirá los bits sin procesar de un flotante

Cómo scanf y printf manejan variables en C

Compilar y ejecutar el código es donde la teoría se encuentra con la realidad. Si te saltas este paso, sólo estás adivinando. La función scanf opera de manera similar a printf con respecto a las cadenas de formato, pero tiene un requisito de entrada más estricto. Debes colocar el operador de dirección (& ) antes de las variables de tipo char, int, float y estructuras. Sin él, el programa falla.

¿Por qué scanf requiere el operador de dirección?

El signo comercial no es opcional. Le dice al compilador que almacene la entrada directamente en la ubicación de memoria de la variable. Si lo omite, desencadena un error de tiempo de ejecución. Deberías intentar eliminarlo intencionalmente. Ver el accidente es más educativo que leer sobre él. Muestra exactamente cuán frágil puede ser C cuando las direcciones de memoria no se administran correctamente.

Cómo da formato printf a los usuarios

printf envía texto a la salida estándar. La versión más simple se ve así:

Esto imprime la palabra “Hola” sin nueva línea. Compara eso con:

El \n agrega un retorno de carro. Termina la línea. Sin él, el siguiente resultado aparece en la misma línea. Es un pequeño detalle que arruina la legibilidad si se ignora.

Cómo incrustar variables en cadenas printf

Para generar el valor de una variable, se utiliza un marcador de posición. El operador %d se reemplaza con el valor entero de la variable. Considere este ejemplo:

Puedes encadenar llamadas printf separadas para mezclar texto y variables, pero es ineficiente:

El enfoque más limpio incorpora el marcador de posición en la cadena:

También funcionan varios marcadores de posición:

El número de comodines debe coincidir exactamente con el número de variables. Los tipos también deben corresponder. Tres especificadores %d requieren tres parámetros int en el mismo orden. Los tipos o recuentos no coincidentes provocan un comportamiento indefinido.

¿Qué marcadores de posición manejan diferentes tipos de C?

printf admite tipos C estándar a través de especificadores de formato específicos:

  • int usa %d
  • flotante usa %f
  • char usa %c
  • cadenas de caracteres use %s

Puede encontrar documentación detallada escribiendo man 3 printf en una máquina UNIX. Otros compiladores proporcionan páginas de manual o archivos de ayuda similares.

Errores comunes de C que se deben evitar

La distinción entre mayúsculas y minúsculas es estricta. Printf o PRINTF fallarán. Debe ser “printf” en minúscula.

  • Olvidar el & en scanf provoca fallos en el tiempo de ejecución.
  • Los recuentos de parámetros no coincidentes en printf o scanf corrompen la salida.
  • El uso de variables no declaradas produce errores de compilación.

La depuración de estos problemas a menudo se reduce a verificar primero la sintaxis. El compilador normalmente le dirá exactamente dónde se encuentra la discrepancia. Sólo tienes que leer el mensaje de error.