¿Cómo puedo distinguir entre enteros y caracteres cuando uso scanf ()?

Solo estoy usando la función scanf() . El código está abajo:

 scanf("%d",&a); printf("%d",a); 

Cuando ingreso 1, imprime 1 como quiero. Pero incluso cuando ingreso 1a, se imprime 1 como antes. cuando un usuario ingresa algo que no es entero ((ex) 2.3,12ab, 1 a) quiero mostrarle a un usuario la advertencia como “entero de entrada”.

¿Como puedó resolver esté problema?

Léelo todo en una cadena con fgets() .

Si solo desea que todo lo que ingresen sea un solo int , camine por la cadena y busque isdigit() en cada carácter y luego, cuando encuentre que solo son dígitos, llame a strtod() , si no, emita un error y vuelva a -rápido.

Si desea analizar varias cosas desde la misma línea de entrada, entonces necesita analizar la cadena con algo como strtok() para obtener tokens individuales de uno en uno, luego observe cada token y determine si es un número mirando para ver si cada carácter es un isdigit() o es igual a '-' '.' y cosas por el estilo. Si es así, analízalo como un número con strtol() o strtod() (etc) (dependiendo de lo que veas, int o float / double). De lo contrario, analiza el token como una cadena o emite un error.