Recientemente escribí un programa simple en el que, por error, uso scanf() en lugar de printf() para mostrar un mensaje en la consola. Esperaba obtener un error de tiempo de compilación, pero se compila bien sin advertencias y fallas en el tiempo de ejecución. Sé que scanf() se usa para tomar entradas del teclado. ¿No debería recibir un error al seguir el programa?
#include <stdio.h> int main() { scanf("Hello world"); // oops, It had to be printf() return 0; }¿Invoca un comportamiento indefinido (UB)? ¿Hay alguna mención sobre esto en el estándar C? ¿Por qué no se verifica en el momento de la compilación si los argumentos adecuados y válidos se pasan a la función scanf() o no?
El código se está comportando correctamente. De hecho, scanf se declara
int scanf(const char *format, ...); Por suerte, su format no contiene ningún % para el que no habría correspondencia en ... , lo que invocaría a UB.
Además, el format es un literal de cadena que permite que el compilador lo revise, asegurándose de que pasó el tipo correcto de parámetros con respecto a los especificadores de formato, como parte de las comprobaciones de cordura habilitadas con niveles de advertencia más altos. (-familia de formato W)
Pasar una cadena a scanf compila bien, porque scanf espera una cadena como su primer parámetro. Consulte la documentación o el manual de programación para obtener una descripción detallada del scanf .
El compilador no puede leer tu mente.
Tanto printf("Hello world") como scanf("Hello world") están bien formados.